gpt4 book ai didi

c++ - 没有数据成员和大括号语法的类的默认复制构造函数

转载 作者:太空狗 更新时间:2023-10-29 22:57:18 24 4
gpt4 key购买 nike

考虑以下类定义:

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 上我得到错误:

too many initializers for '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 的一个特性。

关于c++ - 没有数据成员和大括号语法的类的默认复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44820006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com