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
};
Run Code Online (Sandbox Code Playgroud)
我gcc 7.2.0和它一起尝试过.clang 5.0.0
这些编译器在这方面不符合标准,还是constexpr允许隐式虚函数?
编译器有一个bug.请注意,已经在clang 3.5中修复了这个问题,不确定为什么你没有收到错误,因为我这样做了.
该标准在[dcl.constexpr] p3中非常清楚:
constexpr函数的定义应满足以下要求:
- 它不应该是虚拟的;
- [...]
是否doSomething含蓄无关紧要virtual.在这两种情况下,都被认为是virtual,因此它违反了上述观点.