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