完美转发
一、完美转发不是语言必需的
首先要明确,正如你不必掌握模板也可以写出正确的代码,完美转发也不是不可替代的,完全可以用重载来代替它。
二、为什么要引入完美转发
引入完美转发是因为引入了右值引用和移动语义。
有时候我们为了效率,不仅要提供copy语义,还要提供move语义的实现。
在完美转发出现之前,我们只能通过重载来实现。
#include <iostream>
using namespace std;
//bar可以是第三方的代码
//foo是我们要实现的代码
void bar(const int&v){
cout<<"const bar"<<endl;
}
void bar(int&v){
cout<<"lv bar"<<endl;
}
void bar(int&&v){
cout<<"rv bar"<<endl;
}
//我们希望foo的功能根据参数的类型有不同的实现
void foo(int&v){
bar(v);
}
void foo(int&&v){
//我们希望以右值传入bar
//所以这里不能写成bar(v)
bar(std::move(v));
}
int main(