没有任何类减法运算符超载,但仍然可以工作

时间:2019-06-06 08:31:02

标签: c++

我有这段代码:

#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

它在编译时不会抛出错误吗?

任何想法都会受到赞赏。

2 个答案:

答案 0 :(得分:4)

当编译器看到n1 - n2时,它将执行重载解析。对于任何一对提升的算术类型LR,以下签名均参与重载解析:

LR operator-(L, R)

其中LR是对LR进行常规算术转换的结果。 (请参见cppreference)没有其他参与过载解析的签名是有意义的。

因此,n15.0f的帮助下转换为operator T2(),而n2被类似地转换为1。而5.0f - 14.0f

答案 1 :(得分:0)

n2已转换为intn1已转换为floatint可以自动升级为浮动。我希望表达式n1-n2的类型为float

请注意,编译器对一个参数最多执行一次用户定义转换。