ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## std::forward完美转发 std::move接受一个对象,并允许您将其视为临时对象(右值)。尽管这不是语义要求,但是通常,接受对右值的引用的函数会使它无效。当您看到时std::move,表明该对象的值以后不应再使用,但是您仍然可以分配一个新值并继续使用它。 std::forward有一个用例:将模板化的函数参数(在函数内部)转换为用于传递它的调用方的值类别(左值或右值)。这允许将右值参数作为右值传递,并将左值作为左值传递,这是一种称为“完美转发”的方案。 ```#include <iostream> using namespace std; void F(int& a) { cout << "F&(" << a << ")" << endl; } void F(int&& a) { cout << "F&&(" << a << ")" << endl; } template<class A> void G(A&& a) { return F(a); // 如果不使用std::forward转发,G中将始终调用void F(int&)这个版本 } int main() { int i = 2; G(i); G(5); } ``` 输出结果: ``` F&(2) F&(5) ``` 而用了std::forward ``` #include <iostream> using namespace std; void F(int& a) { cout << "F&(" << a << ")" << endl; } void F(int&& a) { cout << "F&&(" << a << ")" << endl; } template<class A> void G(A&& a) { return F(std::forward<A>(a)); // 完美转发 } int main() { int i = 2; G(i); G(5); } ``` 输出结果: ``` F&(2) F&&(5) ```