C++;特殊函数的隐式定义 在当前版本的C++草稿(2019年9月)中,段落状态:

C++;特殊函数的隐式定义 在当前版本的C++草稿(2019年9月)中,段落状态:,c++,constructor,language-lawyer,implicit-declaration,defaulted-functions,C++,Constructor,Language Lawyer,Implicit Declaration,Defaulted Functions,当odr使用([basic.def.odr])来创建其类类型的对象([intro.object])、常量求值([expr.const])需要它时,或者在第一次声明后显式默认时,默认且未定义为已删除的默认构造函数将隐式定义。[...]. 在隐式定义类的默认构造函数之前,应隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数。[注意:隐式声明的默认构造函数具有异常规范([except.spec])。显式默认的定义可能具有隐式异常规范,请参见[dcl.fct.def]。-结束注意] 为默认析

当odr使用([basic.def.odr])来创建其类类型的对象([intro.object])、常量求值([expr.const])需要它时,或者在第一次声明后显式默认时,默认且未定义为已删除的默认构造函数将隐式定义。[...]. 在隐式定义类的默认构造函数之前,应隐式定义其基类及其非静态数据成员的所有非用户提供的默认构造函数。[注意:隐式声明的默认构造函数具有异常规范([except.spec])。显式默认的定义可能具有隐式异常规范,请参见[dcl.fct.def]。-结束注意]

为默认析构函数指定类似的限制

突出显示的句子是什么意思?这是对程序还是对实现(编译器)的限制


引用段落的第一句话说明何时隐式定义默认构造函数(例如,当使用odr时)。如果突出显示的句子是对程序的限制,那么下面的示例应该是格式错误的,因为在(1)中使用了默认的
B
构造函数,因此它是隐式定义的。但是,此时,
A
的默认默认构造函数尚未隐式定义,因此突出显示的句子中的限制未得到遵守。这是因为我相信只有在定义了
B
的默认构造函数之后,才会使用
A
的默认构造函数。这个假设是错误的吗

struct A {};
struct B : A {};

int main()
{
    B b; // (1)
}

谢谢。

我认为突出显示的句子意味着,在您的示例中,A的默认构造函数将在B的默认构造函数之前隐式定义。因此,它应该是对编译器的限制。如何限制程序何时隐式定义某些内容?这就是编译器的工作。我把它理解为实现的一个要求-它应该首先(隐式)定义基类构造函数,而不是派生类构造函数。在我看来,在1,默认的默认构造函数不是隐式定义的,但默认构造函数是显式默认的,但是隐式定义的默认构造函数。如果突出显示的句子是对实现的限制,那么引用段落第一句中隐式定义的定义是不完整的。为什么您认为没有使用odr的隐式默认构造函数?我认为突出显示的句子意味着,在您的示例中,A的默认构造函数将在B的默认构造函数之前隐式定义。因此,它应该是对编译器的限制。如何限制程序何时隐式定义某些内容?这就是编译器的工作。我把它理解为实现的一个要求-它应该首先(隐式)定义基类构造函数,而不是派生类构造函数。在我看来,在1,默认的默认构造函数不是隐式定义的,但默认构造函数是显式默认的,但是隐式定义的默认构造函数。如果突出显示的句子是对实现的限制,那么引用段落的第一句中隐式定义的定义不完整。为什么您认为不使用odr的隐式默认构造函数?