在下面的C ++代码中,a
的类型是什么? typeid
返回St16initializer_listIPKcE
auto a = { "lol", "life" };
答案 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*>&)'