14.50 1) int ex1 = ldObj; 需要把LongDouble转换为int,LongDouble未定义对应的类型转换运算符,会先把LongDouble转换为double或float,再转为int,operator double()和operator float()都符合要求,产生二义性;
2) float ex2 = ldObj; 与operator float()精确匹配。
14.51 double转换为int是标准类型转换;double转换为LongDouble是用户自定义转换;标准类型优先,所以cal(dval)会调用 void calc(int).
14.52 先列出相关的类型:
class SmallInt {
friend SmallInt operator+(const SmallInt&, const SmallInt&);
public:
SmallInt(int = 0);
operator int() const { return val; }
private:
std::size_t val;
};
struct LongDouble {
LongDouble operator+(const SmallInt&);
LongDouble(double = 0.0);
operator double();
operator float();
};
LongDouble operator+(LongDouble&, double);
SmallInt si;
LongDouble ld;
ld = si + ld;
ld = ld + si;
对于 l