C++ move 和 forward的使用

关键词 : 右值引用

  1. 所有函数的形式参数都是左值

 void func(Wight&& w) {...};

形参w的类型是右值引用,但是是个左值

  1. 针对上面一点,无论传入的实参数是何种类型,形参都是左值,如果函数内部调用其他函数,永远是调用左值版本,使用move调用右值版本,使用forward根据传入类型,调用相应版本。

void fun_1(Wight &w) {...}; // 左值版本
void fun_1(Wight &&w) {...}; // 右值版本
 void func(Wight&& w) {
	fun_1(w); // 只能调用左值版本
	fun_1(std::move(w)); // 一定调用右值版本
	fun_1(std::forward(w)); // 根据传入参数类型调用左值还是右值版本
}
  1. forward如何知道传入是左值还是右值?引用折叠

C++一般是不允许定义引用的引用的,但是引用折叠可以

引用折叠的规则:(对于引用的引用)其中任意一个是左值引用,整个就是左值引用,否则(即两者都是右值)才是右值引用

函数参数为万能引用的函数模版,在实例化的时候会根据传入参数的类型确定函数的型别

template<typename T> void func(T&& param){...};
// 1. 传入左值,模版具化为:
void func(T& && param) {...};

此时param的类型是指向左值引用的右值引用,引用折叠之后是左值引用。

// 2. 传入右值时候:
void func(T&& && param) {...};

此时param的类型是指向右值的右值引用,引用折叠之后是右值引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值