六一的部落格


关关难过关关过,前路漫漫亦灿灿。




等价

a sym b

二者均有可能

1a.operatorsym(b);
2operatorsym(a, b);

我们不能通过调用形式来区分当前调用的是成员函数还是非成员函数


重载运算符与内置运算符二义性

如果我们对同一个类既提供了转换目标是算术类型的类型转换, 也提供了重载的运算符, 则会遇到重载运算符与内置运算符二义性的问题

 1class SmallInt
 2{
 3    friend SmallInt operator+(const SmallInt &, const SmallInt &);
 4public:
 5    SmallInt(int = 0);
 6    operator int() const { return val; }
 7
 8private:
 9    size_t val;
10};
11
12SmallInt s1, s2;
13SmallInt s3 = s1 + s2;
14int i = s3 + 0;       // 存在二义性: int的加法还是友元

函数匹配与运算符重载



等价

a sym b

二者均有可能

1a.operatorsym(b);
2operatorsym(a, b);

我们不能通过调用形式来区分当前调用的是成员函数还是非成员函数


重载运算符与内置运算符二义性

如果我们对同一个类既提供了转换目标是算术类型的类型转换, 也提供了重载的运算符, 则会遇到重载运算符与内置运算符二义性的问题

 1class SmallInt
 2{
 3    friend SmallInt operator+(const SmallInt &, const SmallInt &);
 4public:
 5    SmallInt(int = 0);
 6    operator int() const { return val; }
 7
 8private:
 9    size_t val;
10};
11
12SmallInt s1, s2;
13SmallInt s3 = s1 + s2;
14int i = s3 + 0;       // 存在二义性: int的加法还是友元