没有数据成员和大括号语法的类的缺省拷贝构造函数

时间:2017-06-29 08:29:58

标签: c++ c++11 copy-constructor list-initialization

考虑以下类定义:

class A { };

也就是说,A是没有数据成员的类(即使它没有函数成员)。

以下代码按预期工作,因为编译器为类A生成默认构造函数默认复制构造函数

A foo;
A bar(foo); // calls A's default copy constructor

但是,如果使用大括号语法而不是括号。代码无法编译:

A foo;
A bar{foo}; // ERROR

在GCC 4.9.3上我收到错误:

  

'A'的初始化程序太多了

通过执行以下任何一点,最后一个代码段可以正常工作:

  • 数据成员添加到A类定义。
  • A类定义中明确定义复制构造函数(甚至不使用= default作品)。当然,在执行上述代码之后,还必须定义默认构造函数,因为它不再由编译器生成。

任何想法为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

您可以在使用gcc 5.1时编译此示例,但仅在使用c ++ 14时才能编译,您可以使用-std = c ++ 14标志启用它。

关注http://en.cppreference.com/w/cpp/language/aggregate_initialization 你可以在例子中看到:

S s1 = { 1, { 2, 3, {4, 5, 6} } };
S s2 = { 1, 2, 3, 4, 5, 6}; // same, but with brace elision
S s3{1, {2, 3, {4, 5, 6} } }; // same, using direct-list-initialization syntax
S s4{1, 2, 3, 4, 5, 6}; // error in C++11: brace-elision only allowed with equals sign
                        // okay in C++14

所以这似乎是一个c ++ 14的功能。

答案 1 :(得分:0)

正如Zereges在他的评论中所说,代码未编译的问题是GCC中的错误

自版本6.1起,此错误在GCC中得到修复,代码按预期编译。