4

次の形式の enum クラス変数のインスタンス化に遭遇しましたが、VS2012 で警告やエラーなしでコンパイルしています。

UINT32 id;
enum class X {apple, pear, orange};
X myX = X(id);

X(id)さらに、コンパイル済みの X 型 param を期待する関数に引数として送信します。結果が常に正しいのか、それともコンパイラの奇妙な動作なのかはわかりません。

ただし、上記の代わりに実行しようとするX myX(id);と、コンパイル エラーが発生しました。

エラー C2440: '初期化中': 'UINT32' から 'X' に変換できません。列挙型への変換には、明示的なキャスト (static_cast、C スタイルのキャスト、または関数スタイルのキャスト) が必要です。

C++11 標準を読んでも、理解するのに役立ちませんでした。だから私はこの件に関して2つの質問があります:

  1. 整数型をパラメーターとして列挙型クラス オブジェクトを構築することは可能ですか?
  2. 1 が true の場合、なぜX myX(id)機能しないのですか?
4

1 に答える 1

2

その構文で列挙型を作成しているのではありません。代わりに、からにキャストするための代替の明示的なキャスト構文を使用していUINT32ますenum class X。たとえば、次のようにdoubleをintに明示的にキャストすることができます。

double p = 0.0;
int f = int(p)

C ++で使用できるすべてのさまざまなキャスト構文については、このスタックオーバーフローの投稿を参照してください。

コードは、次のようなより一般的なキャスト構文で同等に記述できます。

UINT32 id;
enum class X {apple, pear, orange};
X myX = (X)id;
于 2012-10-18T15:23:40.913 に答える