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

验证C++移动语义理解:传值参数两次用std::move是否正确?

C++移动语义示例的正确性判断
#include <string>
#include <utility>

class MyClass
{
public:
  void Set(std::string str)
  {
     myString = std::move(str); 
  }
private:
  std::string myString;
};

int main()
{
  std::string largeString = "A very long piece of text...";
  
  // 此场景下largeString会被复制一次,因为是按值传递(是否正确?)
  MyClass myClass;
  myClass.Set(largeString);
  
  // 此场景下largeString不会被复制,因为被移动了两次(是否正确?)
  MyClass myClass2;
  myClass.Set(std::move(largeString)); // 执行此语句后,main()中不能再使用largeString
  
  return 0;
}

注释正误分析

  1. 第一个注释完全正确:按值传递参数时,会从largeString复制构造出函数参数str,这是整个过程中唯一的一次复制操作;后续myString = std::move(str)是移动赋值,不会产生新的字符串副本。
  2. 第二个注释部分正确,部分存在错误:
    • 「largeString不会被复制」的表述正确:std::move(largeString)将左值转换为右值引用,参数str会通过移动构造从largeString初始化,而非复制;后续myString = std::move(str)也是移动赋值,全程没有复制操作。
    • 「被移动了两次」的表述错误:largeString仅被移动一次(用于构造函数参数str),之后是str被移动赋值给myString,并非largeString被移动两次。
    • 「执行此语句后,main()中不能再使用largeString」的表述正确:移动操作完成后,largeString处于有效但未定义的状态,C++标准不保证它仍持有原有值或能正常使用,除非对其重新赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:39:13