自动初始化列表的类型
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*>&)'
在下面的 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*>&)'