嗨,我正在尝试了解构造函数在 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/