Code: Select all
#include
#include
template
struct S {
T t[3];
/*
aggregate deduction candidate:
template
S F(const T(&)[3]);
*/
};
int main() {
auto s1 = S{{"hi"}}; // I expected decltype(s1) == S
static_assert(std::is_same_v); // passes
auto s2 = S{"hi"}; // I expected this to be a compilation error
auto s3 = S{"hi"}; // OK: prints "hi"
auto s4 = S{{"hi"}}; // OK: prints "hi"
}
< /code>
Zitate aus cppreference.com < /p>
Lassen Sie E i < /sub> das (möglicherweise rekursive) Aggregatelement sein, das aus Arg. T 1 , t 2 ,…, t n des Kandidaten des Aggregatsabzugs wie folgt:
Wenn e i ein Array ist und ein Sub> -Regal ist. Deklarierte Art von e i < /sub>. wörtlich
[b] Was ich erwartet hatte, [/b]
[*] für s1:
E₁ ist t
Nach dem zweiten Zitat sollte T₁ konstant sein. Arg₁ ist ein String-buchstäblicher Streicher, Klammer-Elision sollte nicht zugelassen werden, daher erwartete ich, dass auto s2 = s {"hi"}; schlecht geformt werden.
Code: Select all
s1
ab
Code: Select all
s2