2

Cスタイルの変換が、順序付けられた一連の変換static_cast, dynamic_cast, reinterpret_cast, static_cast...にすぎないことを覚えている場合は、次のことを考慮してください。

enum NUMBERS
{
    NUMBER_ONE,
    NUMBER_TWO
};

void Do( NUMBERS a )
{
}

int _tmain(int argc, _TCHAR* argv[])
{   

    unsigned int a = 1;
    Do( a ); //C2664
    return 0;
}

Cスタイルの変換は

Do( (NUMBERS)a );

私が知りたいのは、行われるべき正しい非Cスタイルの変換は何ですか、なぜですか?

4

3 に答える 3

7

正しい方法は次のとおりです。

static_cast<NUMBERS>(a)

なぜなら:

8)整数、浮動小数点、または列挙型は、任意の列挙型に変換できます(列挙の基になる型に変換された式の値が、ターゲットの列挙値の1つでない場合、結果は指定されません)

ソース:http ://en.cppreference.com/w/cpp/language/static_cast

dynamic_castRTTIを使用して実行時チェックを行うため、少なくとも1つの仮想メソッドを持つクラスにのみ適用されます。

reinterprest_castは、実際の実行時変換なしで、特定のメモリを別のタイプとして扱うようにコンパイラに指示するように設計されています。

于 2012-10-19T19:40:23.213 に答える
5
static_cast<NUMBERS>(a)

static_castの仕様には次のものが含まれているため:

整数型または列挙型の値は、明示的に列挙型に変換できます。元の値が列挙値(7.2)の範囲内にある場合、値は変更されません。それ以外の場合、結果の値は指定されません(そして、その範囲内にない可能性があります)。浮動小数点型の値は、列挙型に変換することもできます。結果の値は、元の値を列挙型の基になる型(4.9)に変換し、続いて列挙型に変換するのと同じです。

static_castは、通常、あるタイプの値を取得し、その値を別のタイプとして表すためのものです。すべての詳細をカバーする仕様は約2ページありますが、その基本的な考え方を理解していれば、static_castをいつ使用するかがわかるでしょう。たとえば、ある積分タイプから別の積分タイプに積分値を変換する場合、または浮動小数点値を積分値に変換する場合です。

dynamic_castは、動的型を操作するためのものであり、ほとんどの場合、ポリモーフィックなユーザー定義型にのみ役立ちます。たとえば、参照されるオブジェクトが実際にDerivedである場合は、Base*をDerived*に変換します。

reinterpret_castは通常、あるタイプの値の表現を取得し、別のタイプの同じ表現を持つ値を取得するためのものです。つまり、型のパンニング(C ++では多くの型のパンニングは実際には合法ではありませんが)。たとえば、整数のストレージにcharの配列としてアクセスする場合。

const_castは、タイプの任意のレベルでcv修飾子(constおよびvolatile)を追加および削除するためのものです。例えば、int const * volatile **i; const_cast<int volatile ** const *>(i);

于 2012-10-19T19:37:51.457 に答える
0

static_cast<>行く方法です:

これが理由です

于 2012-10-19T19:39:45.070 に答える