自动初始化列表的类型
Type of an auto initialized list
在下面的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*>&)'
相关文章:
- 使用简单类型列表实现的指数编译时间.为什么
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 测试两个类型列表中的所有组合
- 谷歌测试:模板模板的笛卡尔乘积的类型列表与模板
- 在迭代模板类型列表时无法停止递归
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- 阅读从 istream 到矢量的不同类型列表
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- c++17通过生成预先声明的类型列表的笛卡尔乘积来生成std::变体
- 将变量模板限制为类型列表
- 我可以使用特征指定变体的类型列表吗?
- 如何对要用于模板参数的类型列表进行编码
- 创建类型列表并访问每种类型的静态成员?
- 为什么BOOST :: HANA :: EXAREMIS ::键入实验功能?类型列表的棘手是什么
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- std::仅移动类型列表:不能在 VC++ 中放入 std::vector
- C++类型列表创建子列表
- 调用STD ::功能,并带有变体类型列表
- 在没有宏的情况下在 C++98 中创建类型列表时遇到问题
- 如何从类型列表重建参数包