为什么花括号初始化列表不是表达式?

3

我正在阅读C++11标准的第93页$5.1.2,其中提到在这种情况下使用花括号初始化列表是不合法的:

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

我找到了两个相关主题,一个来自标准,另一个来自N3681提案。

第397页$14.8.2.5:初始化列表参数导致参数被视为非推断上下文。和$7.6.1.4:用新发明的类型模板参数U或std::initializer_list替换auto的出现,如果初始化器是花括号初始化列表(8.5.4),则用std::initializer_list替换。

而N3691提案建议“将大括号初始化的auto更改为不推导为初始化列表,并禁止大括号初始化的auto用于具有多个元素的情况。”它说“返回大括号列表不起作用,因为它不是表达式” http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3681.html

然而,我没有找到“为什么花括号初始化列表不是表达式?” 它可能与这个主题有相同的含义: 为什么我们不能有自动推断的返回类型? 但是,在他试图理解为什么C++委员会得出这种语法毫无价值的结论时,有一些小差异。所以这必须有一个特定的原因吧?非常感谢。

1个回答

2
引用自http://www.stroustrup.com/default-argument.pdf
“初始化列表不是表达式的原因在于,我们决定(我认为是正确的)不允许在赋值的左侧使用初始化列表,也不允许在++等运算符的操作数中使用。而且我们通过语法规则来强制执行这一点。”

1
好的,但在我看来这并没有回答问题。第一部分(“不允许出现在LHS”)适用于例如&var(它是语法中的一个表达式),而第二部分基本上说“它不是一个表达式(在语法中)因为我们决定将其作为一个强制执行第一部分的手段而不将其作为语法中的一个表达式”(可以通过其他方式进行强制执行)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接