隐式虚拟constexpr功能

Max*_*V37 10 c++

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允许隐式虚函数?

Rak*_*111 8

编译器有一个bug.请注意,已经在clang 3.5中修复了这个问题,不确定为什么你没有收到错误,因为我这样做了.

该标准在[dcl.constexpr] p3中非常清楚:

constexpr函数的定义应满足以下要求:

  • 它不应该是虚拟的;
  • [...]

是否doSomething含蓄无关紧要virtual.在这两种情况下,都被认为是virtual,因此它违反了上述观点.