30 April 2022

C++ 核心指南目录

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 转发给其他函数。标记警告。