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

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

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?

16

Решение

Законно ли C ++ использовать эту функцию следующим образом?

Да, это нормально.

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

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

Это правило применимо здесь?

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

20

Другие решения


По вопросам рекламы [email protected]