This question already has answers here:
No implicit conversion in overloaded 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