使用 std::move 和在数字上加 0 之间的区别?

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)

我知道我们不能对所有类型执行这种中立的操作,但我的问题特别是关于整数而不是其他类型。

use*_*522 7

std::move(x)并且x+0不要做同样的事情。

前者为您提供一个引用 的右值(特别是 xvalue)x。后者为您提供一个右值(特别是纯右值),它(在临时物化之后)引用一个临时对象,其生命周期在完整表达式之后结束。

sof(x+0);不会导致x被修改,而 whilef(std::move(x))会被修改。

专门对 a ​​进行右值引用int可能是毫无意义的。移动和复制标量类型是完全相同的操作,因此与仅 相比没有任何好处int&

您的函数既按值返回结果,又尝试修改参数。通常,它应该只执行其中一项操作。如果它接受引用并修改参数,它应该具有void返回值或返回对参数的引用。如果它应该按值返回结果,那么它不需要传递引用,只需接受一个int参数即可。(如果返回的值与参数的新值无关,例如返回参数的旧值,则可以修改std::exchange参数并按值返回。)