我有这段代码:
#include <iostream>
using namespace std;
template <typename T1, typename T2>
class Number {
T1 value;
public:
Number(const T1& val): value(val){};
operator T2() { return (T2)(value / 2); }
T1 operator+(const T1& val) { return value + val; }
};
int main() {
Number<int, float>n1(10);
Number<float, int>n2(3.0);
cout << n1 + n2 << ", " << n2 + n1 << ", " << n1 - n2 << endl;
}
尽管没有减法运算符,但是此代码仍然可以工作并输出:
11, 8, 4
。
它在编译时不会抛出错误吗?
任何想法都会受到赞赏。
答案 0 :(得分:4)
当编译器看到n1 - n2
时,它将执行重载解析。对于任何一对提升的算术类型L
和R
,以下签名均参与重载解析:
LR operator-(L, R)
其中LR
是对L
和R
进行常规算术转换的结果。 (请参见cppreference)没有其他参与过载解析的签名是有意义的。
因此,n1
在5.0f
的帮助下转换为operator T2()
,而n2
被类似地转换为1
。而5.0f - 1
是4.0f
。
答案 1 :(得分:0)
n2
已转换为int
,n1
已转换为float
,int
可以自动升级为浮动。我希望表达式n1-n2
的类型为float
。
请注意,编译器对一个参数最多执行一次用户定义转换。