错误:无法为对象合成构造函数 我试图理解构造函数是如何在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; };

错误:无法为对象合成构造函数 我试图理解构造函数是如何在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; };,c++,class,c++11,struct,default-constructor,C++,Class,C++11,Struct,Default Constructor,这些是我已经知道的:我知道类NoDefault没有默认构造函数,结构B有一个默认构造函数(我们明确定义了)。我还知道,如果我们不为类提供任何构造函数,那么它将自动生成默认构造函数。因此,根据这一点,应该为结构a自动生成默认构造函数,因此结构a和结构B现在都应该有自己的默认构造函数。现在我得到了一个错误: main.cpp:在构造函数“B::B()”中: main.cpp:23:5:错误:调用“NoDefault::NoDefault()”时没有匹配的函数 B(){}//错误:B_成员没有初始值设

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

main.cpp:在构造函数“B::B()”中: main.cpp:23:5:错误:调用“NoDefault::NoDefault()”时没有匹配的函数 B(){}//错误:B_成员没有初始值设定项

我的问题是为什么
结构A
中没有相同的错误?结构A不是有自己的合成默认构造函数版本吗?我猜在结构B中我们会遇到错误,因为当编译器尝试默认初始化
B_成员时,它无法这样做,因为类
NoDefault
没有默认构造函数,并且我们没有为B_成员使用任何初始值设定项。但是同样的事情也应该发生在结构A上。为什么这两个结构之间有区别

因此,根据这一点,应该生成一个默认构造函数 自动为结构A

。。。当需要生成时

如果您实际尝试创建它的实例,您将发现它也无法工作。如果试图声明
A
的实例,编译器将尝试生成一个实例,但失败

B
的情况下,您正在定义一个显式构造函数,由于它无法显式构造它的
B_成员
,编译器尝试将其设为默认构造函数,但由于它没有默认构造函数而失败。

声明了
a
的默认构造函数

3隐式声明的默认构造函数 如果没有为类类型(struct、class或union)提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的内联公共成员

但在您的小示例中,它没有定义,因为它从未被调用/需要

4隐式定义的默认构造函数 如果隐式声明的默认构造函数未定义为deleted,则如果odr用于或需要进行常量计算(自C++11以来),编译器将定义它(即生成并编译函数体)


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

a
没有默认的合成构造函数,因为无法使用默认的逐个成员构造的构造函数来合成它。如果您将程序的
main()
函数放在这里,这会更有帮助。@Gupta这里是:
int main(){return 0;}
@JasonLiam所以,正如你提到的,你没有在main中初始化
A
,所以编译器不会对此抱怨。好的,我在一本C++11的书中读到:“如果我们的类没有显式定义任何构造函数,编译器将为我们隐式定义默认构造函数”。请注意,它是编写为define而不是declare,我想这就是我感到困惑的原因。