{} 与 () class 成员的初始化

{} vs. () initialization of a class member

我不明白为什么下面的代码可以编译?

struct A{ A(int); }; struct B{ A a{1}; };

但这不是:

struct A{ A(int); }; struct B{ A a(1); };

错误:数字常量前需要“,”或“...”

编译器不接受第二种形式有什么原因吗?我知道最令人烦恼的解析歧义,但我认为这个问题是相关的。

编辑:正如博在下面的评论中所解释的那样,我错了。这个问题毕竟与令人烦恼的解析有关。

我在 gcc-5.1.0 上用 --std=c++11

试过了

In-class在引入大括号语法后增加了非静态成员的初始化,为了避免混淆,例如most-vexing-parses,只对大括号语法起作用直接初始化(也允许复制初始化)。

语法构造被命名为 brace-or-equal-initializer(在 C++11 和 C++14 中,正如 chris 在评论中指出的那样,C++1z更改名称)。