You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何以std::move作为函数参数时变量值未发生改变?

关于std::move的核心要点

首先纠正你的核心误解:std::move(variable)作为函数参数完全不等同于传引用,你的Case-2里原变量没变化,问题出在这几个关键细节:

  1. std::move的本质只是「类型转换」
    std::move本身不会移动任何数据,它仅负责把一个左值(比如你的myNum)强制转换成对应的右值引用类型。对于int这种基础类型来说,右值引用和普通左值在传值调用时没有区别——函数依然会创建原变量的副本,修改副本自然不会影响原变量。

  2. 基础类型没有「移动语义」
    移动语义是为那些持有堆内存资源的类型设计的(比如std::string、std::vector这类容器)。这些类型的移动构造/赋值函数会直接接管原对象的资源,而非拷贝。但int这种类型没有堆资源,移动和拷贝的行为完全一致,所以用std::move传int和直接传值没有任何区别。

  3. 什么时候该用std::move传参?
    只有当函数参数是支持移动语义的类型,且你明确希望让函数接管原变量的资源时,才需要用std::move传参。举个实际场景的例子:

#include <string>
void takeString(std::string s) {
    // 处理字符串逻辑
}

int main() {
    std::string myStr = "hello world";
    takeString(myStr); // 触发拷贝构造,复制整个字符串的内存
    takeString(std::move(myStr)); // 触发移动构造,直接把myStr的内存资源转移给函数参数s,原myStr会变为空(处于合法但可赋值的状态)
}

这种场景下,std::move可以避免不必要的内存拷贝,提升性能,同时完成资源所有权的转移。

如果你的需求是直接修改原变量,正确的做法是使用传引用,比如把函数改成:

void increaseNum(int& num) {
    num += 1;
}

此时不管是传myNum还是std::move(myNum)(右值引用会被绑定到左值引用参数上),都会直接修改原变量的值。

内容的提问来源于stack exchange,提问作者test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:02:03