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;
),那么您将得到预期的错误。
您好,我想了解构造函数在 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;
),那么您将得到预期的错误。