带有自动initializer_list包含多个表达式
initializer_list with auto contains multiple expressions
相当简单的问题,
auto x11 {1,2,3,4};
auto x1 = {1,2,3,4};
auto x22 {1.0, 2.25, 3.5};
auto x2 = {1.0, 2.25, 3.5};
据我了解,这里应该没有=
的区别。但是,使用 llvm/clang 6.0.0(使用 --std=c++17(,我得到:
main1.cpp:35:17: error: initializer for variable 'x11' with type 'auto' contains multiple
expressions
auto x11 {1,2,3,4};
~~~~~~~~ ^
main1.cpp:37:20: error: initializer for variable 'x22' with type 'auto' contains multiple
expressions
auto x22 {1.0, 2.25, 3.5};
摘自斯特劳斯特鲁普C++书,第162页:
auto x1 {1,2,3,4}; // x1 is an initializer_list<int>
auto x2 {1.0, 2.25, 3.5 }; // x2 is an initializer_list of<double>
那么,没有=真的有问题吗?
自 N3922 以来,自动类型扣除规则发生了变化。(这在C++14中被视为缺陷(。
在直接列表初始化中(但不是在复制列表初始化中(, 当从大括号初始化列表中推断出汽车的含义时, 大括号初始化列表必须只包含一个元素,并且 auto 的类型 将是该元素的类型:
auto x1 = {3}; // x1 is std::initializer_list<int> auto x2{1, 2}; // error: not a single element auto x3{3}; // x3 is int // (before N3922 x2 and x3 were both std::initializer_list<int>)
因此,在 N3922 之前,示例中的所有变量都可以正常工作,并且类型为std::initializer_list<int>
。但是从 N3922 开始,对于直接初始化(即对于x11
和x22
(,大括号初始值设定项必须只包含一个元素(它们的类型将是元素的类型(,然后代码变得格式不正确。
有关详细信息,请参阅 N3922 和 N3681。
相关文章:
- C++ 在堆栈中包含多态属性的类对象存储
- 即使我没有包含多个文件,C++中的多个定义错误
- 实现包含多个 QQuickPaintedItems 的 QQuickView 的滚动
- C++文件包含多行
- 如何存储包含多个空格的字符串 c++
- 如果代码包含多个复杂度循环,如何计算复杂度
- 将包含多个元素的字符串作为输入并转换为矢量 C++
- 将元素添加到 std::list 在多线程中,无需 C++ 互斥锁
- 项目中包含多个相同的头文件:C与C++
- 当我在结构中包含多个数组时,我的程序会跳过一堆代码
- 如何检查一个字符串是否包含多个其他字符串?
- 带有自动initializer_list包含多个表达式
- 释放包含多个向量的结构的内存
- 如何检查数组是否包含多个元素?
- 如何在 arduino 库中包含多个目录
- std::bind to a std::variant 包含多个 std::函数类型
- 最快/最小方法检查字符串是否包含多个单词
- 如何创建包含多个字母的字符串变量
- 将包含多个类型变量的 PVOID 数组传递给 _beginthreadex()
- 包含多态对象的向量:静态断言误差