2011-06-15 11 views
10
constexpr int get() { return 5; } 
template<int N> struct Test {}; 

int main() 
{ 
    int a[get()]; // ok 
    Test< get() > obj; // error:'int get()' cannot appear in a constant-expression 
} 

私はcompiled this code with ideoneです。なぜコンパイルエラーが出るのか不思議に思っていました。 関数はtemplate引数として許可されていないか、コンパイラのバグですか?テンプレート引数としてconstexpr関数を使用することは有効ですか?

編集は:またint get()const int get()を変更し、ideoneとはあなたがconstexprその後、still declaring an array is allowedを削除する場合は、ということである1つの以上バグがあります!私はそれがC99の機能だと思う。

+0

あなたの編集が間違っていたので、あなたは 'constexpr const get()'を作成しました。 – GManNickG

+0

@GMan、ありがとう... – iammilind

+3

これはC99の機能であり、gccはそれを拡張子として持っていますが、適切なC++ではないので移植できません。これは、標準に含めると考えられ、不変式を破るので拒否されました。コンパイル時に型(型の一部です)を知っていなければなりません。 Cではそれほど重要ではありませんが、C++では、その配列をテンプレート(コンパイル時には正確な型は不明です)への型引数として使用することはできません。これはgccの動作であり、あなたがそれをやろうとすると文句を言う。 –

答えて

13

GCC 4.5(少なくともIdeoneで使用されているバージョン)は、有効な使用方法を含めてconstexprを完全にサポートしていません。それはconstまで下がります。 GCC 4.6以上で正しくサポートされています。

関連する問題