CppCoreGuidelines F.19 要“完美转发”参数,通过 TP&& 传递参数,只用 std::forward 转发参数
30 April 2022
F.19: For “ forward ” parameters, pass by TP&&
and only std::forward
the parameter
理由
如果一个函数不直接使用参数,只是要把参数传给其他函数,那么要有办法让这个函数不改变参数的 const
属性和右值属性。
当且仅当在这种情况下,要把参数设置成右值引用TP&&
,其中 TP
为模板参数类型。这样就不用关心只读 const
属性和右值属性,也会保留这些属性。因此,任何代码使用了TP&&
就表示其不关心且保留只读 const
属性和右值属性,但是它可以把这些属性完美的转发给其他代码。因为调用过程中,TP&&
参数是一个只读的临时对象,所以是安全的。TP&&
类型的参数,在函数体中,最终应该通过std::forward
转发给别的函数。
例子:
template<class F, class... Args> inline auto my_invoke(F f, Args&&... args) { return f(forward<Args>(args)...); } int ff (int x, int y) { cout << x << " " << y << endl; return 0; } int main() { my_invoke(ff, 11, 12); return 0; }
11 12
强化:
- 如果一个函数接受
TP&&
类型参数,但是没有在每个静态分支路径上用std::forward
转发给其他函数。标记警告。