CppCoreGuidelines F.18 要移动的参数,通过 X&& 传递,并用 std::move 移动
27 April 2022
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&&
参数 - 标注对象转移后还进行访问的地方
- 不要在条件分支里进行移动