/ / C ++暗黙の変換、バイナリ演算子[duplicate] - c ++、operator-keyword、暗黙変換

バイナリ演算子によるC ++暗黙の変換[duplicate] - c ++、operator-keyword、暗黙変換

私は初心者のための簡単なラッパーを書いています標準の演算子の種類が多すぎるのを避けようとしています。暗黙的な型変換が助けてくれることを期待していましたが、そうではありません。ここでは、抜粋した例があります:

struct Int
{
int _i;
Int(int i=0) :_i{i} {}
Int operator+ (const Int& rhs) {return _i+rhs._i;}
};

int main(int argc, char *argv[])
{
(void)(Int(1) + 2); // Fine
(void)(2 + Int(1)); // error: invalid operands to binary expression ("int" and "Int")
}

私はllvmを使用しています。 メインの最初の行はうまくコンパイルされます。 2番目にエラーが発生します。 2番目の行では、2が暗黙的にInt(2)に変換され、続いてoperator +が呼び出されることが期待されています。最初の行で暗黙の変換が行われるのはなぜですか?

回答:

回答№1は2

最初の行では、 operator+ 利用可能です operator+(Int&) (暗黙的な第1のパラメータは Int のために this インスタンス)。 2番目の行は、最初のパラメータが int 操作を試みる前に変換する必要があるという手掛かりはありません(使用する必要があることはわかりません Int::operator+)。

この問題を回避するには、演算子を非メンバフレンド関数にする(http://ideone.com/YCf7wX

struct Int
{
int _i;
Int(int i=0) :_i{i} {}
friend Int operator+(const Int& lhs, const Int& rhs);
};

Int operator+(const Int& lhs, const Int& rhs)
{
return lhs._i+rhs._i;
}

int main()
{
Int i;
i + 5;
5 + i;
return 0;
}