没有数据成员和大括号语法的类的默认复制构造函数
Default copy constructor for a class without data members and brace syntax
请考虑以下类定义:
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
工作)。当然,在这样做之后,还必须定义默认构造函数才能使上面的代码正常工作,因为它不再由编译器生成。
任何想法为什么会这样?
您可以在使用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 功能。
正如Zereges在他的评论中所建议的那样,代码不编译的问题是GCC中的一个错误。
此错误在 GCC 中从版本 6.1 开始已修复,代码按预期编译。
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- 如何在QTreeView中禁用默认复制行为?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 默认复制/移动构造函数时 GDB 中的奇怪行为
- C++默认复制构造函数不可行
- 没有数据成员和大括号语法的类的默认复制构造函数
- C++中默认复制构造函数的奇怪行为
- 将功能添加到默认复制构造函数中
- C 带有什么默认复制构造函数使用什么初始化基本复制构造函数
- 如果我默认复制构造函数,将生成构造函数和移动分配
- 为什么要删除基类的默认复制并移动ctor和赋值
- 对象数组的默认复制行为
- C++11:是用户声明的默认复制构造函数
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 非默认复制构造函数会减慢程序的速度吗?
- 错误:没有与默认复制构造函数调用匹配的函数
- 使用默认复制构造函数时出错:"deleted function"
- 是c++中线程安全的默认复制构造函数
- 使用模板化构造函数时禁用默认复制构造和赋值构造函数