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

{} vs. () initialization of a class member

本文关键字:初始化 成员      更新时间:2023-10-16

我不明白为什么要编译以下代码?

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

尝试了这个

引入大括号语法后,添加了非静态成员的类内初始化,为了避免混淆(如大多数令人烦恼的解析),它只能使用大括号语法进行直接初始化(也允许复制初始化)。

语法结构名为大括号或相等初始值设定项(在C++11和C++14中,正如chris在评论中所指出的,C++1z会更改名称)。