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