自动初始化列表的类型

时间:2016-10-17 19:26:59

标签: c++ types initializer-list auto

在下面的C ++代码中,a的类型是什么? typeid返回St16initializer_listIPKcE

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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*>&)'