ERROR: Cannot synthesize a Constructor for A

ERROR: Cannot synthesize a Constructor for A

您好,我想了解构造函数在 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;
};


这些是我已经知道的事情:我知道 class NoDefault 没有默认构造函数并且 struct B 有一个默认构造函数(我们明确定义)。我还知道,如果我们不为 class 提供任何构造函数,那么它会自动生成一个默认构造函数。所以根据这个应该为 struct A 自动生成默认构造函数所以结构 A 和结构 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 没有自己的合成默认构造函数版本吗?我猜在结构 B 中我们会收到错误,因为当编译器尝试默认初始化 b_member 时它不能这样做,因为 class NoDefault 没有默认构造函数并且我们没有为 b_member。但是同样的事情应该发生在struct A上。为什么这两个struct之间存在差异?

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

...需要生成的时候

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

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

cppreference 所述,已声明 A 的默认构造函数。

3 Implicitly-declared default constructor
If no user-declared constructors of any kind are provided for a class type (struct, class, or union), the compiler will always declare a default constructor as an inline public member of its class.

但是在你的小例子中,它没有被定义,因为它永远不会 called/needed。

4 Implicitly-defined default constructor
If the implicitly-declared default constructor is not defined as deleted, it is defined (that is, a function body is generated and compiled) by the compiler if odr-used or needed for constant evaluation (since C++11),

如果您尝试调用它(只需添加一个 A a;),那么您将得到预期的错误。