Ответ 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
к одному и тому же объекту.