在没有限定的情况下从 T 构造函数调用类 T 的纯虚拟实现?



考虑到从类T的构造函数的T成员函数的虚拟调用(直接或间接),最多可以降低到T的实现,请执行以下代码,以下代码,使用不合格的呼叫,行为是否不确定?

注意,要避免噪声:如果您认为从构造函数调用时实际上未调用成员功能,请在此处回答或评论,而是在单独的问题中提出问题。谢谢。

struct Baze
{
    virtual void foo();
    virtual void bar() = 0;
    Baze(){ foo(); bar(); }
};
void Baze::foo() {}
void Baze::bar() {}
struct Derived: Baze
{
    void bar() override {}
};
int main()
{
    Derived{};
}

我相信这是由[class.abstract]/6(N4140)涵盖的:

可以从抽象类的构造函数(或破坏者)调用成员函数;做一个 虚拟呼叫(10.3)直接或间接用于创建(或破坏)的对象的纯虚拟函数 从这样的构造函数(或破坏者)不确定。

因此,即使您为纯虚拟函数提供了一个定义,它仍然是技术UB。

有一个核心工作组问题,可以在此处解决此问题。看来规则不太可能改变这个定义明确的。

最新更新