27 April 2022

C++ 核心指南目录

F.18: For “ will-move-from ” parameters, pass by X&& and std::move the parameter

理由

如果在调用的地方需要显式的用std::move转移一个左值,那么,这个形参的类型最好是X&&这样的形式定义。如此处理,可以保证效率较高,避免调用处产生 bug。

例子

// sink takes ownership of whatever the argument owned
void sink(vector<int>&& v)
{
    // usually there might be const accesses of v here
    store_somewhere(std::move(v));
    // usually no more use of v here; it is moved-from
}

注意,通过std::move(v)移动参数后,store_somewhere()函数会把 v 变量留在移动之前的状态。这样是比较危险的。

例外

唯一所有权的变量只能通过移动进行参数传递,这类变量移动传参性能损耗也相对不太高。比如unique_ptr这样的变量,只能进行移动。所以传参的时候进行值传递也能达到一样的效果。而且,这样还能能够做到简洁和清晰,所以可以规避显式的移动操作。

例子

template<class T>
void sink(std::unique_ptr<T> p)
{
    // use p ... possibly std::move(p) onward somewhere else
}   // p gets destroyed

强化

  • 标注函数体内没有进行std::move操作的X&&参数
  • 标注对象转移后还进行访问的地方
  • 不要在条件分支里进行移动