C++移动操作的时机
同拷贝构造、赋值操作符一样,移动操作也是在合适的时候被编译器调用,一般情况下:
- 函数通过值返回结果
- 对象被赋值且右侧是一个临时对象
- 对象被使用一个临时对象进行初始化
有时候源对象并不是一个临时对象,也不在上述的场景当中,那么想要显示触发移动操作,可以借助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转发问题针对的是模板函数。
...