如果一个类既提供了转换目标是算术类型的类型转换,也提供了重载的运算符,则将会遇到重载运算符与内置运算符的二义性问题。
如果a是一种类型,表达式 a sym b 可能是:
//不能通过调用形式来区分当前调用的是成员函数还是非成员函数
a.operatorsym(b); //a有一个operatorsym 成员函数
operatorsym(a,b); //operatorsym 是一个普通函数
eg.
class SmallInt{
friend SmallInt operator + (const SmallInt&,const SmallInt&);
public:
SmallInt(int = 0);
operator int() const {return val;}
private:
std::size_t val;
};
SmallInt s1,s2;
SmallInt s3 = s1 + s2; //使用重载的 operator+
//二义性错误,可以把0转换成 SmallInt,然使用 SmallInt 的 +;
//或者把 s3 转换成 int,然后对于两个 int 执行内置的加法。
int i = s3 + 0;
- 表达式中运算符的候选函数集既包括成员函数,也包括非成员函数。
- 当使用重载运算符作用于类类型的对象时,候选函数中包含了该运算符的普通非成员版本和内置版本。除此之外,如果左侧运算对象是类类型,则定义在该类中的运算符的重载版本也包含在候选函数内。
【引用】
[1] 代码classTypeExchange.h