带有自动initializer_list包含多个表达式

initializer_list with auto contains multiple expressions

本文关键字:list 包含多 表达式 initializer      更新时间:2023-10-16

相当简单的问题,

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 开始,对于直接初始化(即对于x11x22(,大括号初始值设定项必须只包含一个元素(它们的类型将是元素的类型(,然后代码变得格式不正确。

有关详细信息,请参阅 N3922 和 N3681。