自动初始化列表的类型

Type of an auto initialized list

本文关键字:类型 列表 初始化      更新时间:2023-10-16

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

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

当你有

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

你的问题的答案是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*>&)'