Неявно виртуальная функция 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.0 и clang 5.0.0.

Являются ли эти компиляторы не соответствующими стандарту в этом отношении или неявно виртуальные constexpr функции разрешены?

Ответ 1

У компиляторов есть ошибка. Обратите внимание, что это уже исправлено в clang 3.5, не уверен, почему вы не получаете ошибку, потому что я это делаю.

Стандарт довольно подробно описан в [dcl.constexpr] p3:

Определение функции constexpr должно удовлетворять следующим требованиям:

  • он не должен быть виртуальным;
  • [...]

Не имеет значения, является ли doSomething неявным virtual или нет. В обоих случаях он считается virtual, и поэтому он нарушает указанную выше точку.