考虑到从类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。
有一个核心工作组问题,可以在此处解决此问题。看来规则不太可能改变这个定义明确的。