自动初始化列表的类型

Type of an auto initialized list

在下面的 C++ 代码中,a 的类型是什么? typeid returns 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*>&)'