1

在当前版本的 C++ 草案(2019 年 9 月)中,第[class.default.ctor]/4段指出:

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

[class.dtor]/11为默认析构函数指定了类似的限制。

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

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

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

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

谢谢你。

4

0 回答 0