Когда я пытаюсь скомпилировать следующее на 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() определяет +=
как операцию-член, почему она делает это, когда такое использование позволяет левой стороне быть временной? Почему бы не определить его так, как я дал выше, и не ссылаться на временные проблемы?