c++ - {} vs. () 类成员的初始化

标签 c++ c++11 gcc initialization

<分区>

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

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 试过这个

最佳答案

非静态成员的类内初始化是在引入大括号语法后加入的,为了避免最烦人的解析等混淆,只使用大括号语法进行直接初始化(复制初始化)也是允许的)。

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

关于c++ - {} vs. () 类成员的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33379673/

相关文章:

c++ - 如何更改此 C++ 代码以使输入更好地工作

c++ - Cygwin: g++ 5.2: ‘to_string’ 不是 ‘std’ 的成员

c++ - 这是 static_cast 有效/合法吗?

c++ - 使用 std::mutex 复制类

c++ - 导入到 Python 3 时 Boost.Python 和 C++ 编译库错误

c++ - 如何检测类型是否可以流式传输到 std::ostream?

c++ - 回调函数参数的 C++11 std::bind 和 auto 编译错误

c - 矩阵声明上的 SIGSEGV

c++ - 构建 WxWidgets 示例程序时的错误消息

c - gcc 的性能下降很大,可能与内联有关