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

向按值传递的函数参数使用std::move是否可行?

向按值传递的函数参数使用std::move是否可行?

当然可行,而且你这两种用法都是完全合理的,咱们来拆解下每种场景的逻辑和效果:

  • 场景1:传递原字符串的拷贝
    当你直接调用foo(myString)时,因为函数参数是按值声明的,编译器会自动创建一份myString的拷贝给形参str。这时候你的原始myString完全不受影响,就像你复印了一份文档交给别人,自己手里的原件还好好的,完美匹配你「想保留原始状态」的需求。
    代码示例:

    std::string myString = "any data that I want to keep in its original state";
    foo(myString);
    
  • 场景2:用std::move转移所有权
    当你调用foo(std::move(myString))时,std::move本质是把myString标记为「可以被移动」的状态,函数的形参str会通过移动构造函数接管myString的底层内存数据,而不是做耗时的拷贝操作。这时候myString会变成「有效但未定义」的状态——简单说就是你不能再访问它原来的内容了,但可以给它重新赋值或者正常销毁它,这正好适合你「不再需要原数据」的场景,能省不少性能开销,尤其是字符串内容很长的时候。
    代码示例:

    std::string myString = "any data that I don't need anymore";
    foo(std::move(myString));
    // 注意:此时myString的旧数据已经被转移,别再用它原来的内容了
    

总结一下:按值传参的函数本身就支持这两种用法,拷贝还是移动完全取决于你是否需要保留原对象的内容,按需选择就好。

备注:内容来源于stack exchange,提问作者altchist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:13:07