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

Tob*_*ull 16 c++ sequence-points move-semantics c++11

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

template<typename T>    
std::unique_ptr<T> process_object(std::unique_ptr<T> ptr);
Run Code Online (Sandbox Code Playgroud)

该函数可以返回传递给它的对象(移动版本)或完全不同的对象.

使用此函数是合法的C++如下吗?

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

pw = process_object(std::move(pw));
Run Code Online (Sandbox Code Playgroud)

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

如果一个人std::unique_ptr被鄙视取代std::auto_ptr怎么办?

Mik*_*our 20

使用此函数是合法的C++如下吗?

是的,没关系.

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

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

这条规则适用于此吗?

否.在函数调用之前对函数参数进行排序,并在赋值之前对其进行排序.所以这两个访问都是有序的,一切都很好.

  • 无耻的插件:我写了一篇关于[测序规则]的文章(http://josephmansfield.uk/articles/c++-sequenced-before-graphs.html),它通过用图形可视化规则来帮助. (7认同)
  • @JosephMansfield我想给你买啤酒. (2认同)