Подтвердить что ты не робот

Что стандартная библиотека гарантирует самопереключение?

Что говорит стандарт С++ 11 о назначении самостоятельного перемещения по отношению к стандартной библиотеке? Чтобы быть более конкретным, что, если что-либо, гарантируется тем, что делает selfAssign?

template<class T>
std::vector<T> selfAssign(std::vector<T> v) {
  v = std::move(v);
  return v;
}
4b9b3361

Ответ 1

17.6.4.9 Аргументы функции [res.on.arguments]

1 Каждое из следующих утверждений относится ко всем аргументам к определенным функциям в стандартной библиотеке С++, если явно не указано иное.

...

  • Если аргумент функции привязывается к параметру ссылки rvalue, реализация может предполагать, что этот параметр является уникальной ссылкой на этот аргумент. [Примечание: если параметр является общим параметром форма T && и lvalue типа A связано, аргумент связывается с lvalue (14.8.2.1) и, следовательно, не покрывается предыдущим предложение. - примечание к концу] [Примечание: если программа передает значение l xvalue при передаче этого lvalue в библиотечную функцию (например, вызывая функцию с аргументом move (x)), программа эффективно прося эту функцию рассматривать эту lvalue как временную. Реализация бесплатна для оптимизации проверок сглаживания, которые может потребоваться, если аргумент был равен значению. -endnote]

Таким образом, реализация std::vector<T, A>::operator=(vector&& other) допускает, что other является значением prvalue. И если other является prvalue, самоперемещение-присваивание невозможно.

Что может случиться:

v будет оставлено в состоянии без ресурсов (емкость 0). Если v уже имеет емкость 0, то это будет no-op.

Обновление

последний рабочий черновик N4618 был изменен, чтобы четко указать, что в требованиях MoveAssignable выражение:

t = rv

(где rv - значение r), t должно быть только эквивалентным значением rv до назначения, если t и rv не ссылаются на один и тот же объект. И независимо, состояние rv не задано после назначения. Существует дополнительное примечание для дальнейшего уточнения:

rv должен по-прежнему соответствовать требованиям компонента библиотеки, который его использует, независимо от того, относятся ли они к t и rv к одному и тому же объекту.

Ответ 2

Ничего не произойдет. Умный оператор присваивания может немедленно вернуться, если &other == this. В противном случае он сам присваивает свои внутренние функции, ничего не делая.