Почему += действительны временные файлы в стандартной библиотеке ?

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

5
задан Clinton 8 March 2012 в 01:47
поделиться