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

时间:2015-01-23 14:18:24

标签: c++ c++11 move-semantics sequence-points

假设一个人具有以下原型的功能

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该怎么办?

1 个答案:

答案 0 :(得分:20)

  

使用此功能是合法的C ++吗?

是的,没关系。

  

如果我没记错的话,有一条C / C ++规则禁止在一个完整的表达式中多次修改一个对象。

不完全。您不能多次修改对象(或修改它并使用其值)以及无序访问。

  

此规则是否适用于此处?

没有。在函数调用之前对函数参数的计算进行排序,函数调用在赋值之前进行排序。所以这两个访问都是有序的,一切都很好。