类成员的{}与()初始化区别

4
我不明白下面的代码为什么能编译通过?
struct A{ A(int); }; struct B{ A a{1}; };

但这个不行:
struct A{ A(int); }; struct B{ A a(1); };

错误:在数字常量之前应输入“,”或“…”

编译器为什么不接受第二种形式?我知道最令人烦恼的语法解析模糊性,但我认为这个问题与此有关。

编辑: 正如Bo在下面的评论中解释的那样,我错了。这个问题确实与令人烦恼的语法解析有关。

我在gcc-5.1.0上尝试了这个问题,使用--std=c++11参数。


我认为这与A a{int()};有关,但明确不包括A a(int()); - Bo Persson
1
@Bo:后者声明了一个成员函数,是吗? - Ben Voigt
1
@Ben - 是的,这就是为什么它不用于初始化的原因。 :-) 还禁止 A a(1);,因为它会引起令人烦恼的解析。 - Bo Persson
1个回答

10
在引入大括号语法之后,非静态成员的班级初始化被添加,并且为避免类似于最令人困惑的解析之类的混淆,它只能与大括号语法一起用于直接初始化(复制初始化也是允许的)。
该语法结构被命名为“花括号或等号初始化程序”(在C++11和C++14中,正如chris在评论中所指出的,C++1z更改了名称)。

从Kona开始,这被改为默认成员初始化器 - chris

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