30

クラス内で、可能な最大のint値である定数を定義したいと思います。このようなもの:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}

この宣言は、次のメッセージでコンパイルに失敗します。

nude.cpp:8:エラー:'std :: neuro_limits :: max()'は定数式に表示できませんnumeric.cpp:8:エラー:関数呼び出しは定数式に表示できません

これが機能しない理由は理解できますが、2つのことが奇妙に見えます。

  1. 定数式で値を使用するのは自然な決断のように思えます。言語設計者がmax()を関数にして、この使用を許可しないことにしたのはなぜですか?

  2. 仕様は18.2.1で次のように主張しています

    nude_limitsテンプレートでstaticconstと宣言されたすべてのメンバーについて、特殊化は、これらの値を整数定数式として使用できるように定義する必要があります。

    シナリオで使用できるはずで、エラーメッセージと矛盾しないのではないでしょうか。

ありがとうございました。

4

5 に答える 5

17

ちょっとした欠陥のようです...

C ++ 0xでは、numeric_limitsすべてがでマークされます。つまり、コンパイル時定数としてconstexpr使用できるようになります。min()max()

于 2010-04-29T15:16:21.287 に答える
16

現在の標準はここではサポートされていませんが、整数型の場合、 Boost.IntegerTraitsはコンパイル時定数const_minとを提供しますconst_max

問題は§9.4.2/4から発生します:

静的データメンバーがconstintegralまたはconstenumerationタイプである場合、クラス定義でのその宣言は、整数定数式(5.19)でなければならない定数初期化子を指定できます。その場合、メンバーは積分定数式で表示できます。

追加されることに注意してください:

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

numeric_limit他の人がすでに述べたようmin()に、そしてmax()単に積分定数式ではありません。つまり、時定数をコンパイルします。

于 2010-04-29T15:26:26.780 に答える
14

あなたが欲しい:

#include <limits>

struct A {
static const int ERROR_VALUE;
}; 

const int A::ERROR_VALUE = std::numeric_limits<int>::max();

class / structをヘッダーに入れ、定義を.cppファイルに入れます。

于 2010-04-29T15:13:18.900 に答える
4

maxが定義されていないため、矛盾しませんstatic const。これは単なる静的メンバー関数です。関数をconstにすることはできません。また、静的メンバー関数の右端にconstを付加することもできません。

制限のダブルバージョンにもdouble max()あり、C++03では言うことはできませんstatic double const max = ...。したがって、一貫性を保つために、max()は制限テンプレートのすべてのバージョンの関数です。

さて、そのmax()ように使えないのは悪いことだとわかっていて、C ++ 0xはそれをconstexpr関数にして、提案された使い方を可能にすることですでにそれを解決しています。

于 2010-04-29T15:16:38.467 に答える
2
  • 私はあなたの質問から理解した限りあなたに答えようとします:

1-プログラムのstaticconstintを関数で初期化する場合:

int Data()
{
 return rand();
}

class A
{
public :
    static const int ee;
};
const int A::ee=Data();

これはVS2008で動作します

2-特定のデータ型の最大数と最小数を取得する場合は、これらの定義INT_MAX、INT_MIN、LONG_MAXなどを使用します。

3-ただし、これらのwrtテンプレートタイプを使用する必要がある場合は、テンプレートを自分でハードコーディングします

template<>
int MaxData()
{
 return INT_MAX;
}

template<>
long MaxData()
{
 return LONG_MAX ;
}

このように呼んでください

int y=MaxData<int>();

4-そして、バイナリ表現タイプのみを扱っている場合は、これを使用します。

template <class T>
T MaxData(){
    return ~(1<<((sizeof(T)*8)-1));
}

この

template <class T>
T MinData(){
    return (1<<((sizeof(T)*8)-1));
}

これがお役に立てば幸いです。

于 2010-04-29T16:36:06.537 に答える