Перемещается дважды в одном полном разрешении
Предположим, что у функции есть следующий прототип
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/С++, которое запрещает модификацию объекта более одного раза в одном полном выражении.
Не совсем. Вы не можете изменять объект более одного раза (или изменять его и использовать его значение) с неизученными доступами.
Применяется ли это правило?
Нет. Оценка аргумента функции секвенирована перед вызовом функции, которая секвенирована перед назначением. Таким образом, два доступа упорядочены, и все хорошо.