Im folgenden C++ - Code ist der Typ a
? typeid
kehrt St16initializer_listIPKcE
Typ einer automatisch initialisierten Liste
auto a = { "lol", "life" };
Im folgenden C++ - Code ist der Typ a
? typeid
kehrt St16initializer_listIPKcE
Typ einer automatisch initialisierten Liste
auto a = { "lol", "life" };
Wenn Sie
auto a = { "lol", "life" };
Der Compiler wird versuchen, einen std::initializer_list
abzuleiten, wo der Typ ist, was alle Elemente sind. In diesem Fall sind "lol"
und "life"
beide ein const char[]
, also haben Sie eine std::initializer_list<const char*>
.
Wenn auf der anderen Seite haben Sie so etwas wie
auto foo = { 1, 2.0 };
hatte Dann würden Sie einen Compiler-Fehler aufweisen, da die Elementtypen unterschiedlich sind.
Die Regeln für die automatischen Abzug der intializer Liste sind mit einer expection
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>
Die expection folgt ist, dass vor dem C++ 17
auto x5{ 3 };
ein std::intializer_list<int>
ist, wo in C++ 17 und die meisten Compiler, die die Regel bereits angenommen haben, werden als int
abgeleitet.
Die Antwort auf Ihre Frage ist std::intializer_list<char const*>
Wenn Sie nicht-verstümmelte Name einer Art erfahren möchten, können Sie die undefinierten Vorlage Trick verwenden:
auto a = { "", ""};
get_type_name(a);
template<typename T>
void get_type_name(T&&);
es dann rufen
Sie sollten eine lesbare Fehlermeldung erhalten, die etwas in Richtung
angibt 210undefined reference to `void get_type_name<std::initializer_list<char const*>&>(std::initializer_list<char const*>&)'
Welchen Standard verwenden Sie? 11, 14, 17? auto initializer_list war ein wenig flüchtig ... – DeiDei
'const volatile auto a = {" trollin '"};' –