转换构造函数造成的二义性问题

问题描述:
自定义Time类,写有double转Time和Time转double的转换构造函数,类内重载加号运算符,本来以为写Time1=double1+Time2会引发二义性,
既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则),也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2,但是最后正常运行,想问一下我在哪里理解错误。

#include 
using namespace std;
struct Time 
{
public:
    Time operator+(const Time& t1)
    {
        return Time(hour + t1.hour, minute + t1.minute, second + t1.second);
    }
    Time(int h,int m,int s):hour(h),minute(m),second(s){}
    Time(double d)
    {
        hour = d;
    }
    operator double()
    {
        return hour;
    }
private:
    int hour;
    int minute;
    int second;
};
int main()
{
    Time t1(10,10,10);
    Time t2(t1);
    double d1 = 10, d2 = 5;
    t2 = d1+t2;//既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则)
    //也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2;
    return 0;
}

以下答案引用自GPT-3大模型,请合理使用:
答:

自定义Time类,写有double转Time和Time转double的转换构造函数,类内重载加号运算符。本来以为写Time1=double1+Time2会引发二义性,既可以理解为将d1转换为Time类之后与t2相加(此时d1转换后为Time类符合类内运算符重载规则),也可以理解为t2转换为double型之后相加所得,转化成time后赋给t2,但是最后正常运行。

错在哪里呢?

在C++中,类重载的运算符优先级高于类内的运算符。即当在类中定义了一个重载的运算符时,编译器会自动推导出其他的运算符。在上例中,t2=d1+t2; 其实就是t2=d1+Time(t2);,由于类内已经定义了运算符+,因此会自动调用类内的+。这里需要特别注意的是,类重载的运算符必须要求参数的类型相同。因此在上面的例子中,t1和t2的类型必须相同,即 both of t1 and t2 must be of type Time.