2016-01-16 5 views
7

は、次のコードでX::f()仮想関数をconstexprにできますか?

struct X 
{ 
    constexpr virtual int f() const 
    { 
     return 0; 
    } 
}; 

のような仮想関数はconstexprことはできますか? 【dcl.constexpr]/3(7.1.5、 "constexpr指定子")から

+2

1分だと思います。それは 'constexpr'の目的を完全に打破します。 –

+0

このような仮想関数は、呼び出し元のインスタンスの完全な型が 'X'であることが分かっている場合にのみ、定数式として使用できます。これは本質的に、言語が「非仮想化ルール」を指定することを必要とする。 –

+1

@πάνταῥεD Dでは、仮想関数を使用してコンパイル時の関数評価を行うことができます。それは考えられないことではありません。 –

答えて

24

番号:

constexpr関数の定義は、以下の要件を満足しなければならない:

- それをバーチャルではありません

+0

gccバージョン4.9.2 20141101(Red Hat 4.9.2-1)(GCC) '[それは動作します](http://pastebin.com/gBRT31VG) – zaratustra

+5

コンパイラが何かを受け入れるという理由だけで、それは許されています。 –

+1

Clang ++はリンク内のコードを受け入れません。 –