Неявно виртуальная функция 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
, и поэтому он нарушает указанную выше точку.