隐式虚拟 constexpr 函数

Implicitly virtual constexpr function

本文关键字:函数 constexpr 虚拟      更新时间:2023-10-16

虚拟函数不能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函数?

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

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

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

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

doSomething是否隐式virtual并不重要。在这两种情况下,它都被认为是virtual,因此违反了上述观点。