by Anonymous » 12 Jul 2025, 21:06
Ich untersuche das Argumentabzug der Klassenvorlagen (CTAD) für ein Aggregat mit einem Array -Element, wenn er aus einem String -Literal initialisiert wurde. < /p>
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
(Typ t [3]. "Hi" .
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.
zieht S .
ab
ohne Fehler kompiliert und auch S . zum C ++ - Standard?>
Ich untersuche das Argumentabzug der Klassenvorlagen (CTAD) für ein Aggregat mit einem Array -Element, wenn er aus einem String -Literal initialisiert wurde. < /p>
[code]#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 [/code] (Typ t [3]. "Hi" .
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]s1[/code] zieht S .
ab[code]s2[/code] ohne Fehler kompiliert und auch S . zum C ++ - Standard?>