这与Matthieu M.提供的如何利用移动语义进行+运算符重载(通常是不直接将左参数重新赋值的运算符)这个答案有关。
他建议实现三种不同的重载:
他建议实现三种不同的重载:
inline T operator+(T left, T const& right) { left += right; return left; }
inline T operator+(T const& left, T right) { right += left; return right; } // commutative
inline T operator+(T left, T&& right) { left += right; return left; } // disambiguation
第1和第3个有意义,但我不明白第2个的目的。注释中提到了可交换处理,但似乎1和2是互斥的(即实现两者会导致歧义)
例如,如果全部实现:
T a, b, c;
c = a + b;
编译器输出:
1> 错误 C2593: 'operator +' 有歧义 1> 可能是 'T operator +(const T &,T)' 1> 或 'T operator +(T,const T &)' 1> 当试图匹配参数列表 '(T, T)' 时
如果删除1或2中的任何一个,程序将按预期工作。由于1是一般情况,而2仅在使用交换运算符时才能正确工作,因此我不知道为什么会使用2。我是否漏掉了什么?
inline T operator+(T&&,T&&)
并根据哪个资源更大来选择重用哪一个吗? - balki