隐式虚拟constexpr函数

时间:2017-10-11 19:40:30

标签: 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
};

我尝试使用gcc 7.2.0 clang 5.0.0

这些编译器在这方面是否不符合标准,或者是否允许隐式虚拟constexpr函数?

1 个答案:

答案 0 :(得分:8)

编译器有一个错误。请注意,这已在clang 3.5中修复,不知道为什么你没有收到错误,因为我这样做。

标准在[dcl.constexpr]p3中非常明确:

  

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

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

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