2016-10-17 126 views
2

在下面的C++代碼中,什麼是a的類型? typeid回報St16initializer_listIPKcE自動初始化列表的類型

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

你使用什麼標準? 11,14,17?自動初始化_列表已經有點揮發... – DeiDei

+2

'const volatile auto a = {「trollin'」};' –

回答

5

當你有

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

編譯器將嘗試演繹一個std::initializer_list其中類型是所有元素都是。在這種情況下,"lol""life"都是const char[],因此您有std::initializer_list<const char*>

如果對方有你有這樣的事情

auto foo = { 1, 2.0 }; 

那麼你將有一個編譯器錯誤,因爲元素類型是不同的。是

用於初始化器列表的自動扣除的規則與一個厚望如下

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> 

的厚望是前C++ 17

auto x5{ 3 }; 

std::intializer_list<int>其中在C++ 17並且大多數已經採用該規則的編譯器將其推斷爲int

4

回答你的問題是std::intializer_list<char const*>

如果你想了解一個類型的非錯位的名稱,你可以使用未定義的模板技巧:

template<typename T> 
void get_type_name(T&&); 

然後調用它

auto a = { "", ""}; 
get_type_name(a); 

你應該得到一個可讀的錯誤信息,說明沿着

undefined reference to `void get_type_name<std::initializer_list<char const*>&>(std::initializer_list<char const*>&)'