gl5_progのメモ

自分のためのメモとかまとめとか

(ideoneメモ)2項演算の左オペランドに暗黙の型変換が発生しないことの確認

Ideone.com | Online C++ Compiler & Debugging Tool

#include <stdio.h>
 
class Double
{
public:
  Double operator +( Double other ){ printf( "Double::operator+(Double)\n" ); return *this; }
};
class Float
{
public:
  operator Double(){ printf( "Float to Double\n" ); return Double(); }
};
class Float2
{
public:
  operator Double(){ printf( "Float2 to Double\n" ); return Double(); }
  Double operator +( Double other ){ printf( "Float2::operator+(Double)\n" ); return Double(); }
};
 
 
int main( void )
{
    Double  d;
    Float   f;
    Float2  f2;
    
    printf( "[1]\n" ); 
    d + d;
    
    printf( "[2]\n" );
    d + f; // fはDoubleへ暗黙の型変換が発生する。
    
    /* error: 左オペランドに暗黙の型変換は発生しないのでエラーになる。
    f + d;
    */
    
    printf( "[3]\n" );
    f2 + d; // 左オペランドに暗黙の型変換は発生しないが、Float2はoperator+(Double)を持っているのでエラーにならない。
    
    return 0;
}
[1]
Double::operator+(Double)
[2]
Float to Double
Double::operator+(Double)
[3]
Float2::operator+(Double)

2項演算は本質的にはLEFT::operator+( RIGHT )なので、右オペランドは暗黙の型変換が発生するが、左オペランドには発生しないことを確認。

追記:

演算子オーバーロードをグローバルでやれば、左オペランドにも暗黙の型変換が発生させることができるね。 http://ideone.com/1x6RcP