2017-10-11 15 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であるか否かが問題でdoes't。どちらの場合も、virtualとみなされ、上記の点に違反します。

関連する問題