C++移动操作的时机

同拷贝构造、赋值操作符一样,移动操作也是在合适的时候被编译器调用,一般情况下:

  1. 函数通过值返回结果
  2. 对象被赋值且右侧是一个临时对象
  3. 对象被使用一个临时对象进行初始化

有时候源对象并不是一个临时对象,也不在上述的场景当中,那么想要显示触发移动操作,可以借助std::move操作。std:move会把当前对象直接标记为可移动的,当进行赋值操作时,就会触发移动操作。

C++forward

先理解了移动语义,再看forward就很清晰了。

void fun(int& a){}	//版本1
void fun(int&& a){}	//版本2

template<typename T>
void f(T&& a){
	fun(a);
}

template<typename T>
void f1(T&& a){
	fun(std::forward<T>(a));
}

int main(){
	int i =2;
	f(i);	//调用版本1
	f(5);	//调用版本1
	
	f1(i);	//调用版本1
	f1(5);	//调用版本2
}

因为在模板函数f内部是无法知道形参对应的实参,到底是个普通变量还是一个濒死的临时变量。所以可以借助std::forward,把变量的属性也传递出去。

std::forward转发问题针对的是模板函数