0

質問が変更されました!

列挙型をローカルの名前空間から非表示にする簡単な方法、つまり構造体内の列挙型を使用します。おおよそ次のようになります。

struct Color
{
    enum Type
    {
        Red, Green, Black
    };
    Type t_;
    Color(Type t) : t_(t) {}
    operator Type () const {return t_;}
private:
  template<typename T>
  operator T () const;
};

operator T () は、暗黙的な型キャストからの保護です。次に、このコードを gcc と keil でコンパイルしようとしました。

Color n;
int a[9];
a[ (int)n ] = 1;

gcc はエラーなしでコンパイルしました (これは私が予想していたことです) が、Keil は「無効な型変換です。演算子 () にアクセスできません」というエラーを出しました。

だから私の質問は次のとおりです。どのコンパイラが正しいですか?

C++11 列挙型クラスについては知っていますが、現在 Keil ではサポートされていません

4

1 に答える 1

4

reinterpret_cast (c スタイルの () キャストではない) は、型変換演算子を呼び出す必要がありますか?

いいえ、reinterpret_castいくつかの危険なタイプの変換にのみ使用されます。

  • ポインタを整数に変換して戻す
  • ポインター (および参照) を無関係な型に変換する

暗黙的な変換演算子を使用するためにキャストはまったく必要ありません。暗黙的な変換をまったく防止していません。C++11 では、演算子が だった場合explicitstatic_cast.

C++03 に行き詰まっていて、暗黙の変換は避けたいが明示的な変換は許可したい場合は、名前付きの変換関数を提供することだけが賢明だと思います。

更新: 質問が変更され、 ではなく C スタイルのキャストについて尋ねていreinterpret_castます。static_cast(暗黙的な変換を含む) によって実行できる変換は、C スタイルのキャストでも実行できるため、コンパイルする必要があります。

于 2013-05-21T13:43:28.377 に答える