This question already has answers here:
No implicit conversion in overloaded operator
(2个答案)
5年前关闭。
我正在为基本类型编写一个简单的包装程序,并试图避免不得不编写太多标准操作符。我希望隐式类型转换会有所帮助,但没有帮助。这是一个简化的示例:
我正在使用llvm。第一行主要编译良好。第二个导致错误。现在,我希望在第二行中发生的是将2隐式转换为Int(2),然后再调用operator +。为什么不这样呢?为什么第一行会发生隐式转换?
(2个答案)
5年前关闭。
我正在为基本类型编写一个简单的包装程序,并试图避免不得不编写太多标准操作符。我希望隐式类型转换会有所帮助,但没有帮助。这是一个简化的示例:
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隐式转换为Int(2),然后再调用operator +。为什么不这样呢?为什么第一行会发生隐式转换?
最佳答案
它发生在第一行中,因为唯一可用的operator+
是operator+(Int&)
(对于Int
实例,其隐式第一个参数为this
)。第二行失败,因为第一个参数是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;
}
关于c++ - 使用二进制运算符的C++隐式转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20579199/
10-15 17:45