) const
{
return data[index];// no range checking on index
}
9. 转换可能引起内置操作符的二义性我们再次扩展SmallInt 类。这一次,除了到int 的转换操作符和接受int 参数的构造函数之外,将增加一个重载的加操作符:
class SmallInt {
public:
SmallInt(int = 0); //convert from int to SmallInt
// conversion to intfrom SmallInt
operator int() const{ return val; }
// arithmetic operators
friend SmallInt
operator+(constSmallInt&, const SmallInt&);
private:
std::size_t val;
};
现在,可以用这个类将两个SmallInts 对象相加,但是,如果试图进行混合模式运算,将会遇到二义性问题:
SmallInt s1, s2;
SmallInt s3 = s1 +s2; // ok: uses overloaded operator+
int i = s3 + 0; //error: ambiguous
第一个加使用接受两个SmallInt 值的+ 的重载版本。第二个加有二义性,问题在于,可以将0 转换为SmallInt 并使用+ 的SmallInt 版本,也可以将 s3 转换为int 值并使用int 值上的内置加操作符。
既为算术类型提供转换函数,又为同一类类型提供重载操作符,可能会导致重载操作符和内置操作符之间的二义性。
10. 可行的操作符函数和转换
通过为每个调用列出可行函数,可以理解这两个调用的行为。在第一个调用中,有两个可行的加操作符:
?operator+(const SmallInt&, const SmallInt&)
?The built-in operator+(int, int)
内置的operator+(int, int)。
第一个加不需要实参转换――s1和s2 与形参的类型完全匹配。使用内置加操作符对两个实参都需要转换,因此,重载操作符与两个实参匹配得较好,所以将调用它。对于第二个加运算:
int i = s3 + 0; //error: ambiguous
两个函数同样可行。在这种情况下,重载的+ 版本与第一个实参完全匹配,而内置版本与第二个实参完全匹配。第一个可行函数对左操作数而言较好,而第二个可行函数对右操作数而言较好。因为找不到最佳可行函数,所以将该调用标记为有二义性的。