7

static const メンバーがあり、それを最大整数に設定したいと考えています。私は次のことを試しています:

const static int MY_VALUE = std::numeric_limits<int>::max();

しかし、次のエラーが発生します。

エラー: 静的データ メンバーのクラス内初期化子が定数式ではありません

これに対する解決策はありますか?関数が定数式を返さないのはどうしてですか?

編集: -std=c++11 を追加すると、問題が修正されました。私のルームメイトは、コンパイラ (C++11 より前) は、 std::numeric_limits::max() が他のものを変更しないと判断できるほど賢くないため、定数とは見なされないことを教えてくれました。それがおそらくこのエラーの理由ですか?

4

3 に答える 3

1

定数は、定数式 (コンパイル時に評価可能な式) から初期化する必要があります。

C++03 では、定数式を構築できる定数演算のセットは非常に限られていました。裸の積分とそれらに対する数学演算のみ。

定数式でユーザー定義関数を使用するには、次のものが必要です。

  • C++11 以上
  • マークする関数constexpr

これが、-std=c++11Clang にフラグを追加することが助けになっconstexprた理由constexprですstd::numeric_limits<T>::max()

注: Clang のより新しいバージョンを使用する場合、C++11 がデフォルトになり、許可するためのフラグは必要ありませんconstexpr

于 2016-02-20T15:30:48.273 に答える
0

静的データ メンバーが const 整数型または const 列挙型の場合、クラス定義でのその宣言は、整数定数式 (5.19) である定数初期化子を指定できます。その場合、メンバーは整数定数式に表示できます。

メンバーがプログラムで使用され、名前空間スコープ定義に初期化子が含まれていない場合、メンバーは名前空間スコープで定義されます。

numeric_limits max()は整数定数ではなく、コンパイル時定数です。

于 2016-02-20T09:42:05.007 に答える