为什么braced-init-list不是表达式?

时间:2013-08-02 05:52:26

标签: expression return-type list-initialization

当我正在阅读C ++ 11标准的第93页$ 5.1.2时,在此期间它表示在这种情况下使用braced-init-list是非法的: auto x = [] {return {1,2}}; //错误:braced-init-list不是表达式

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

$ 14.8.2.5:初始化列表参数导致该参数被视为非推导的上下文。 和$ 7.6.1.4:用新发明的类型模板参数U替换auto的出现,或者如果初始化器是braced-init-list(8.5.4),则用std :: initializer_list替换。

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

但是,我没有找到“为什么braced-init-list不是表达式?”它可能具有与本主题相同的含义: Why can't we have automatically deduced return types? 但是当他试图理解为什么C ++委员会认为这种语法毫无价值时,会有一些差异。所以必须有一个特别的原因吗?非常感谢你。

1 个答案:

答案 0 :(得分:2)

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

  

初始化列表不是表达式的原因就在于此   我们决定(正确地,IMO)不允许左侧的初始化列表   分配的手边,作为++等的操作数并进一步决定   (再次正确地说,IMO)通过语法强制执行。