从另一个问题中得出:
C++17之后,auto x0{1, 2, 3, 4};
, 以前是推导初始化器列表,现在不再允许(当然,我们可以使用auto x0 = {1, 2, 3, 4};
代替...)。现在一如既往地避免统一初始化(例如std::vector<int> v({1, 2, 3, 4});
),即使用初始化器列表作为参数的显式构造函数调用,并且类比于定义良好的auto x(7);
(我也永远不会使用的一种构造形式...),我想出了以下内容:
auto x({1, 2, 3, 4});
// -> std::initializer_list<int> x({1, 2, 3, 4});
这个使用GCC 7.2.0 (mingw64)编译通过了,但是出现了一个警告(而注释版本没有):
非类类型的列表初始化器不应该被括在圆括号中
我在标准中找不到任何相关的内容,所以现在的问题是(仅出于纯粹的兴趣...):
为什么不允许这样做?(这是否被标准涵盖,或者我们需要将其视为GCC的错误?)
auto x0 = {1, 2, 3, 4};
仍然被允许。 - user7860670for(int i : {2, 3, 5, 7})
这样的无辜结构。 - StoryTeller - Unslander Monicaauto x{1, 2}
,实际上也禁止了=
变体,但标准委员会在这一点上没有遵循。另一方面,如果它被禁止,我的上述变体将是使用auto创建初始化列表的唯一有效方法,而新标准试图避免这种情况,以支持统一初始化,这可能是允许上述变体的原因... - Aconcagua