Перемещается дважды в одном полном разрешении

Предположим, что у функции есть следующий прототип

template<typename T>    
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr);

Функция может возвращать (перемещенную версию) переданный ей объект или полностью другой объект.

Является ли это законным С++ для использования этой функции следующим образом?

std::unique_ptr<Widget> pw(new Widget());

pw = process_object(std::move(pw));

Если я правильно помню, есть правило C/С++, которое запрещает модификацию объекта более одного раза в одном полном выражении. Применяется ли это правило? Если да, есть ли способ выразить эту идиому по-разному в одной строке?

Что, если заменить std::unique_ptr на презренный std::auto_ptr?

Ответы

Ответ 1

Является ли это законным С++ для использования этой функции следующим образом?

Да, это прекрасно.

Если я правильно помню, существует правило C/С++, которое запрещает модификацию объекта более одного раза в одном полном выражении.

Не совсем. Вы не можете изменять объект более одного раза (или изменять его и использовать его значение) с неизученными доступами.

Применяется ли это правило?

Нет. Оценка аргумента функции секвенирована перед вызовом функции, которая секвенирована перед назначением. Таким образом, два доступа упорядочены, и все хорошо.