{} 与 () 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更改名称)。
我不明白为什么下面的代码可以编译?
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更改名称)。