假设一个人具有以下原型的功能
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
该怎么办?
答案 0 :(得分:20)
使用此功能是合法的C ++吗?
是的,没关系。
如果我没记错的话,有一条C / C ++规则禁止在一个完整的表达式中多次修改一个对象。
不完全。您不能多次修改对象(或修改它并使用其值)以及无序访问。
此规则是否适用于此处?
没有。在函数调用之前对函数参数的计算进行排序,函数调用在赋值之前进行排序。所以这两个访问都是有序的,一切都很好。