2010-11-24 2 views
5

これはなぜ機能しないのですか?numeric_limitsの問題

enum : long {MaxValue = std::numeric_limits<long int>::max()}; 

私はエラーを取得しています:エラー1つのエラーC2057:定数式が期待
をそれについて一定ではなく、何? long intの制限はコンパイル時にわかりますので、何が問題なのですか?

+0

'static constexpr T max(); //(C++ 11以降) '...しかし、VS 2012はC++ 11の多くの機能をサポートしていますが、これはVisual Studio 2012のコンパイル時定数としては機能しません(まだC2057を提供します)。 –

答えて

5

問題はstd::numeric_limits<long int>::max()関数が一定の値を返しますが、それは実行時に呼び出されるであり、あなたが

おそらく、あなただけ(climitsヘッダを参照)の代わりにLONG_MAX値を使用することができ、コンパイル時に定数値を必要とするということですか?

+0

あなたの答え+1に感謝します。この非論理的な振る舞いを回避する方法はありますか? –

+3

C++ 0Xは、この種の問題に対処するのに役立つ 'constexpr'を紹介しています。 – icecrime

+3

Boostには、' const_min'と 'const_max'メンバを持つ' boost :: integer_traits'クラステンプレートもあります。 – Philipp

1

はい、コンパイル時に関数を実行することはできません。 max()

+0

を参照してください。 http://en.wikipedia.org/wiki/Compile_time_function_executionたぶんGCCはCTFEをサポートしていないかもしれませんが、この文脈では、max()はインライン化されている可能性が高く、定数を返すので、コンパイル時にGCCによってうまく評価されます。 –

3

もう1つは言ったように、あなたは定数式が必要です(関数は修飾されません)。最終的にC++ 1xは関数を含むより広い範囲の定数式をサポートします。 n2235およびBjarne StroustrupのFAQ entryを参照してください。

関連する問題