为什么一个有支撑的init列表不是一个表达式



当我阅读C++11标准的第93页第5.1.2美元时,它说在这种情况下使用支持的init列表是合法的:

auto x=[]{return {1,2}}; //error: a braced-init-list is not an expression

我发现了这两个主题,一个来自标准,另一个来自N3681提案。

Page397$14.8.2.5:初始化项列表参数导致参数被视为非推导上下文。$7.6.1.4:将auto的出现替换为新发明的类型模板参数U,或者,如果初始值设定项是一个支撑的init列表(8.5.4),则替换为std::initializer_list。

虽然N3691提案建议";将brace initialized auto更改为不推导到初始值设定项列表,并在brace初始值设定项有多个元素的情况下禁止brace initiated auto"它说";返回一个支撑列表将不起作用,因为它不是一个表达式";http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

然而,我没能找到";为什么一个有支撑的init列表不是一个表达式"它可能与本主题具有相同的含义:为什么可以';我们没有自动推导出退货类型吗?但当他试图理解C++委员会为什么认为这种语法毫无价值时,有一些不同。所以这一定有特别的原因吧?非常感谢。

引用http://www.stroustrup.com/default-argument.pdf:

初始值设定项列表不是表达式的原因很简单我们决定(正确地,IMO)不允许左边的初始值设定项列表赋值的手侧,如++的操作数等,并进一步决定(同样正确,IMO)通过语法来强制执行。

最新更新