允许在单个完整表达式中移动两次

Is moving twice in a single full expression allowed

假设一个函数具有以下原型

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

该函数可能 return 传递给它的对象的(移动版本),或完全不同的对象。

按如下方式使用此函数是否合法?

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

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

如果我没记错的话,有一个 C/C++ 规则禁止在单个完整表达式中多次修改对象。这条规则在这里适用吗?如果是,有什么方法可以在一行中以不同的方式表达这个习语吗?

如果用被鄙视的std::auto_ptr代替std::unique_ptr会怎样?

Is it legal C++ to use this function as follows?

是的,没关系。

If I remember correctly, there is a C/C++ rule that forbids modifying an object more than once in a single full expression.

不完全是。您不能通过无序访问多次修改一个对象(或修改它并使用它的值)。

Does this rule apply here?

没有。评估函数参数在函数调用之前排序,函数调用在赋值之前排序。所以两次访问是有顺序的,一切都很好。