2

当我阅读 C++11 标准的 page93 $5.1.2 时,它说在这种情况下使用支撑初始化列表是非法的:auto x=[]{return {1,2}} ; //错误:花括号初始化列表不是表达式

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

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

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

但是我没找到“Why is abraced-init-list not an expression?”可能和这个题目意思一样: 为什么我们不能自动推导出返回类型? 但是当他试图理解为什么 C++ 委员会认为这种语法毫无价值时,有一点不同。所以这一定有什么特别的原因吗?非常感谢。

4

1 回答 1

2

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

初始化列表不是表达式的原因仅仅是我们决定(正确地,IMO)不允许赋值左侧的初始化器列表,作为 ++ 的操作数等,并进一步决定(再次正确地,IMO ) 通过语法强制执行。

于 2013-08-15T20:02:21.370 回答