Переместить семантику и перегрузку операторов

Это связано сэтот ответ предоставленный Мэтью М. о том, как использовать семантику перемещения с перегрузкой оператора + (обычно операторы, которые непереназначить непосредственно обратно на левый параметр).

Он предложил реализовать три различных перегрузки:

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 будут взаимоисключающими (то есть реализация обоих результатов в двусмысленности)

Например, со всеми 3 реализованными:

T a, b, c;
c = a + b;

Выход компилятора:

1>          error C2593: 'operator +' is ambiguous
1>          could be 'T operator +(const T &,T)'
1>          or       'T operator +(T,const T &)'
1>          while trying to match the argument list '(T, T)'

удаление 1 или 2, и программа работает, как ожидалось. Поскольку 1 является общим случаем, а 2 работает корректно только с коммутативным оператором, я неНе понимаю, почему 2 будет когда-либо использоваться. Есть ли что-то, что ям отсутствует?

Ответы на вопрос(2)

Ваш ответ на вопрос