Предположим, у кого-то есть функция со следующим прототипом
template<typename T>
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr);
Функция может возвращать (перемещенную версию) объект, который был передан ей, или совершенно другой объект.
Законно ли C ++ использовать эту функцию следующим образом?
std::unique_ptr<Widget> pw(new Widget());
pw = process_object(std::move(pw));
Если я правильно помню, есть правило C / C ++, которое запрещает модифицировать объект более одного раза в одном полном выражении. Это правило применимо здесь? Если да, есть ли способ выразить эту идиому по-разному в одной строке?
Что делать, если заменить std::unique_ptr
презираемым std::auto_ptr
?
Законно ли C ++ использовать эту функцию следующим образом?
Да, это нормально.
Если я правильно помню, есть правило C / C ++, которое запрещает модифицировать объект более одного раза в одном полном выражении.
Не совсем. Вы не можете изменить объект более одного раза (или изменить его и использовать его значение) с неупорядоченным доступом.
Это правило применимо здесь?
Нет. Оценка аргумента функции упорядочена перед вызовом функции, который упорядочен перед присваиванием. Таким образом, два доступа последовательно, и все хорошо.