为何以std::move作为函数参数时变量值未发生改变?
关于std::move的核心要点
首先纠正你的核心误解:std::move(variable)作为函数参数完全不等同于传引用,你的Case-2里原变量没变化,问题出在这几个关键细节:
std::move的本质只是「类型转换」
std::move本身不会移动任何数据,它仅负责把一个左值(比如你的myNum)强制转换成对应的右值引用类型。对于int这种基础类型来说,右值引用和普通左值在传值调用时没有区别——函数依然会创建原变量的副本,修改副本自然不会影响原变量。基础类型没有「移动语义」
移动语义是为那些持有堆内存资源的类型设计的(比如std::string、std::vector这类容器)。这些类型的移动构造/赋值函数会直接接管原对象的资源,而非拷贝。但int这种类型没有堆资源,移动和拷贝的行为完全一致,所以用std::move传int和直接传值没有任何区别。什么时候该用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
相关产品推荐
相关产品推荐

