虚函数不能是constexpr
但是,当函数通过继承隐式虚拟时,我试过的编译器不会抱怨它。
以下是示例代码:
class A
{
virtual void doSomething() {}
};
class B : public A
{
constexpr void doSomething() override {} // implicitly virtual constexpr
// but no compilation error
};
class C : public A
{
virtual constexpr void doSomething() override {} // explicitly virtual constexpr
// compilation error
};
我尝试使用gcc 7.2.0
和 。clang 5.0.0
这些编译器在这方面是否不符合标准,或者是否允许隐式虚拟constexpr
函数?
答案 0 :(得分:8)
编译器有一个错误。请注意,这已在clang 3.5中修复,不知道为什么你没有收到错误,因为我这样做。
标准在[dcl.constexpr]p3中非常明确:
constexpr函数的定义应满足以下要求:
- 它不应该是虚拟的;
- [...]
doSomething
是否隐含virtual
无关紧要。在这两种情况下,它都被视为virtual
,因此它违反了上述要点。