c++ - 错误: Cannot synthesize a Constructor for A

标签 c++ class c++11 struct default-constructor

嗨,我正在尝试了解构造函数在 C++ 中的工作原理。为此,我使用以下示例:

class NoDefault
{
public:
  NoDefault (const std::string &){}

};

struct A
{               
  NoDefault my_mem;
};

struct B
{
  B ()
  {
  }             // error: no initializer for b_member
  NoDefault b_member;
};


这些是我已经知道的事情:我知道类 NoDefault 没有默认构造函数,而 struct B 有一个默认构造函数(我们显式定义的)。我还知道,如果我们不为类提供任何构造函数,那么它将自动生成默认构造函数。因此,根据此,应该为 struct A 自动生成默认构造函数,因此 struct A 和 struct B 现在都应该有自己的默认构造函数。现在我收到错误:

main.cpp: In constructor ‘B::B()’: main.cpp:23:5: error: no matching function for call to ‘NoDefault::NoDefault()’ B() {} // error: no initializer for b_member

我的问题是为什么struct A中没有相同的错误? struct A 没有自己的合成默认构造函数版本吗?我猜在 struct B 中我们收到错误,因为当编译器尝试默认初始化 b_member 时,它不能这样做,因为类 NoDefault 没有默认构造函数,并且我们没有使用任何初始化程序对于 b_member。但是同样的事情也应该发生在结构体 A 上。为什么这两个结构体之间存在差异?

最佳答案

So according to this a default constructor should be generated automatically for struct A

...当需要生成时。

如果您确实尝试创建它的实例,您会发现它也不起作用。如果您尝试声明 A 的实例,编译器将尝试生成一个实例,但会失败。

B 的情况下,您正在定义一个显式构造函数,并且由于它无法显式构造它的 b_member,编译器会尝试默认构造它,并且失败是因为它没有默认构造函数。

关于c++ - 错误: Cannot synthesize a Constructor for A,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66303650/

相关文章:

Java 程序错误与 tostring

c++ - 这是测试两条线是否共线的正确方法吗?

c++ - 在 GrabCut 中更新吉布斯能量的数据项

c++ - 如何计算数字范围内的数组项

c++ - 从另一个线程和类 C++ 更新 Winform 控件

c++ - 我可以使用 auto 或 decltype 代替尾随返回类型吗?

c++ - Visual Studio 2012 支持哪个 XP 版本 [As Target OS]

c++ - 如何从具有 std::string 的对象调用函数

C++ - 访问全局变量对象

c++ - 如何使 vector 分配新的(而不是更多的)内存