2017-10-11 76 views
10

虚拟函数不能是constexpr但是,当函数通过继承隐式虚拟时,我试过的编译器不会抱怨它。隐式虚拟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.0clang 5.0.0尝试过。

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

+3

[这铿锵的版本似乎抱怨(http://coliru.stacked-crooked.com/a/a3d1b1ef2348d2c2) – Borgleader

+0

请仔细检查铛 –

+0

这是正确的,我错铛 – MaxV37

回答

8

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

的标准是非常清楚的了解这[dcl.constexpr]p3

一个constexpr功能应满足下列要求的定义:

  • 不得是虚拟的;
  • [...]

这件事简化版,doSomething是否隐含virtual与否。在这两种情况下,它被认为是virtual,所以它违反了上述观点。