6

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

template<int n> struct foo { };

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

    void function(foo<number()> &);
};

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<number()> &);
                          ^~~~~~~~
1 error generated.

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

template<int n> struct foo { };

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

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

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

4

2 に答える 2

5

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

(clang のリリースされたバージョンは、constexpr 関数の評価をサポートしていないため、どのテストケースも動作しません。)

于 2011-11-12T23:38:06.920 に答える
1

次のコードで同様のエラーが発生しました。

struct Test{
     struct Sub{constexpr Sub(int i){}};
    static constexpr Sub s=0;
};

「エラー:'constexpr Test :: Sub :: Sub(int)'が定数式で呼び出されました」gcc4.7.1で。これは正常にコンパイルされます:

struct Sub{constexpr Sub(int i){}};
struct Test{
    static constexpr Sub s=0;
};
于 2012-12-08T06:32:14.373 に答える