从 T 构造函数中无限制地调用 class T 的纯虚拟实现?

Calling class T's implementation of pure virtual from T constructor without qualification?

考虑到 class T 的构造函数对 T 成员函数的虚拟调用(直接或间接),最多可以下降到 T的实现,下面的代码,不合格的调用,是否有未定义的行为?

请注意,为避免噪音:如果您认为从构造函数调用时不会虚拟调用成员函数,那么请不要在此处回答或评论,而是在单独的 SO 问题中提出该问题。谢谢。

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) 涵盖了这一点:

Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.

因此,即使您提供了纯虚函数的定义,它在技术上仍然是 UB。

有一个核心工作组问题可以解决此 here。似乎规则不太可能改变以使其定义明确。