• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ operator演算子の動作について)

C++ operator演算子の動作について

このQ&Aのポイント
  • C++のoperator演算子に関する質問です。
  • プログラムを実行した際のoperator演算子の挙動について理解できません。
  • 特に(1)でなぜコンパイルが通るのかがわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

間違っていたらすみません。私の理解だと次の通りです。 型変換の優先度は、次の通りです。 1. 型変換不要 2. 汎整数拡張 (演算時に、intより小さい変数が勝手にintに拡張されること) 3. 型変換 これを元に解説すると、 (1). intに対する代入なので、 1. operator intを探す 2. 汎整数拡張できる、intより小さい変数型へのoperatorを探す 3. その他型変換できる変数型へのoperatorを探す という順番で解釈されます。 1.は無いので× 2.で、unsigned short型へのoperatorが見つかるので、採用する。 というわけで、(1).はunsigned shortへのoperatorになります。 (2). shortに対する代入なので、 1. operator short を探す 2. その他型変換できる変数型へのoperatorを探す という順番で解釈されるので、 1. は無いので× 2.で、unsigned short型, unsigned long型, unsigned int型へのoperatorがそれぞれ見つかるため、 どれを採用すればいいか、わからないのでエラー ということになります。 (3). も、(2)と同じです。 以下、余談です。 質問者さんは、(2),(3),で、1.の内容を実装することでエラーなしで実行できることを確認されたと思います。 逆に、2.で採用されるものを一つに限定する、すなわちoperator unsigned short以外を削除すれば、これまた エラーなしで実行できるようになります。(多分

mizue_004
質問者

お礼

丁寧な解説ありがとうございました。 おかげさまですっきりしました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ちなみに (2) と (3) のエラーメッセージは出せますか?

mizue_004
質問者

補足

エラーメッセージですが以下になります。(VC++2010で確認) (2) error C2440: '初期化中' : 'UInterger' から 'short' に変換できません。 あいまいなユーザー定義変換です。 (3) error C2440: '初期化中' : 'UInterger' から 'long' に変換できません。 あいまいなユーザー定義変換です。 VC6.0が入ってる別PCでやっても同じ結果になりました。 ちなみに(1)ですが、下記のint型のoperatorを追加して実行したら unsigned short型のほうではなく下記のint型のほうを通っていました。 operator int() { return (int)ul_ui; } ですので各型のoperatorを定義してやれば、特に問題はないのですが 不思議でなりません。。。

関連するQ&A