Ami*_*ahi 0 c++ rvalue-reference move-semantics
我很好奇,使用std::move将左值整数转换为右值与0向该整数添加 a 之间有什么实际区别吗?或任何其他中性算术运算(乘以1、减去0等)。
添加0:
int f(int&& i){
i++;
return i;
}
int main(){
int x = 43;
f(x+0);
}
Run Code Online (Sandbox Code Playgroud)
使用std::move:
#include <iostream>
int f(int&& i){
i++;
return i;
}
int main(){
int x = 43;
f(std::move(x));
}
Run Code Online (Sandbox Code Playgroud)
我知道我们不能对所有类型执行这种中立的操作,但我的问题特别是关于整数而不是其他类型。
std::move(x)并且x+0不要做同样的事情。
前者为您提供一个引用 的右值(特别是 xvalue)x。后者为您提供一个右值(特别是纯右值),它(在临时物化之后)引用一个临时对象,其生命周期在完整表达式之后结束。
sof(x+0);不会导致x被修改,而 whilef(std::move(x))会被修改。
专门对 a 进行右值引用int可能是毫无意义的。移动和复制标量类型是完全相同的操作,因此与仅 相比没有任何好处int&。
您的函数既按值返回结果,又尝试修改参数。通常,它应该只执行其中一项操作。如果它接受引用并修改参数,它应该具有void返回值或返回对参数的引用。如果它应该按值返回结果,那么它不需要传递引用,只需接受一个int参数即可。(如果返回的值与参数的新值无关,例如返回参数的旧值,则可以修改std::exchange参数并按值返回。)