从T构造函数调用类T的纯虚拟实现而没有限定条件?

Che*_*Alf 2 c++ constructor virtual-functions pure-virtual

考虑到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{};
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 5

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

可以从抽象类的构造函数(或析构函数)调用成员函数; 对于从这样的构造函数(或析构函数)创建(或销毁)的对象,直接或间接地对纯虚函数进行虚拟调用(10.3)的效​​果是未定义的.

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

有一个核心工作组问题在这里解决了这个问题.似乎规则不太可能改变以使其明确定义.