从 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。似乎规则不太可能改变以使其定义明确。
考虑到 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。似乎规则不太可能改变以使其定义明确。