constexprを同じクラス内のテンプレートパラメータとして使用する際のエラー

次のC ++ 0xコードをコンパイルしようとすると、エラーが発生します。

template struct foo { };

struct bar {
    static constexpr int number() { return 256; }

    void function(foo &);
};

gcc 4.6.1では、エラーメッセージは次のようになります。

test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’

clang 2.8では、エラーメッセージは次のようになります。

test.cc:6:20: error: non-type template argument of type 'int' is not an integral
      constant expression
        void function(foo &);
                          ^~~~~~~~
1 error generated.

constexpr
関数を基本クラスに移動すると、gccで動作し、clangで同じエラーメッセージが表示されます。

template struct foo { };

struct base {
    static constexpr int number() { return 256; }
};

struct bar : base {
    void function(foo &);
};

コードが間違っていますか、gcc 4.6のC ++
0x実装の制限またはバグですか?コードが間違っている場合、それはなぜ間違っていますか、C ++
11標準のどの節が間違っていると言いますか?

ベストアンサー

C
++では、クラスのメンバー関数のインライン定義は、クラス内のすべての宣言が解析された後にのみ解析されます。したがって、最初の例では、
function()が宣言された時点で、コンパイラは
number()の定義を認識できません。

(clangのリリース版はconstexpr関数の評価をサポートしていないので、あなたのテストケースはそこで動作しません)。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です