2016-10-17 1 views
2

Im folgenden C++ - Code ist der Typ a? typeid kehrt St16initializer_listIPKcETyp einer automatisch initialisierten Liste

auto a = { "lol", "life" }; 
+3

Welchen Standard verwenden Sie? 11, 14, 17? auto initializer_list war ein wenig flüchtig ... – DeiDei

+2

'const volatile auto a = {" trollin '"};' –

Antwort

5

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.

4

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 210
undefined reference to `void get_type_name<std::initializer_list<char const*>&>(std::initializer_list<char const*>&)' 
Verwandte Themen