Когда я пытаюсь скомпилировать следующее на ideone :
class X
{
public:
friend X& operator+=(X& x, const X& y);
};
X& operator+=(X& x, const X& y) { return x; }
int main()
{
X() += X();
}
Как и ожидалось, это приводит к ошибке компиляции, потому что вы не можете передать временную неконстантную ссылку.
Однако следующие данные успешно компилируются на ideone :
std::string() += std::string();
Разве эта ошибка не похожа на мой пример выше?
Редактировать:
Если std :: string () определяет +=
как операцию-член, почему он делает это, когда такое использование позволяет левой сторонебыть временным?Почему бы не определить его так, как я описал выше, и избежать ссылки на временные проблемы?