仅通过模板完美转发

时间:2012-06-13 10:50:08

标签: templates forwarding

我正在读“完美转发”。 为什么这只适用于模板:

// example from justsoftwaresolutions  
void g(X&& t); // 2  
void g(X& t);  // 1  

template<typename T>    
void f(T&& t)  
{  
    g(std::forward<T>(t));   
}    


int main()  
{  
    X x;  
    f(x);   // 1  
    f(X()); // 2  
}  

从f(x)和f(X())的模板生成什么函数?

std:forward是什么

1 个答案:

答案 0 :(得分:0)

请阅读this以了解std::forward的工作原理。

关于“为什么这只适用于模板”的问题。我的理解是std::forward适用于模板和非模板函数。但是没有必要在非模板函数中使用std::forward。例如

void f(X&& x)
{
    g(std::move(x));
}

在上面的代码中,我们确定 x是左值参考。所以我们使用std::move(x)来“转发”对函数g(X&& x)的右值引用。当然,您也可以使用g(std::forward(x))来执行此操作,但我认为它不可能比std::move更好。