C++ 可以移动内置类型、c指针或数组吗

C++ 可以移动内置类型、c指针或数组吗,c++,c++11,stdmove,C++,C++11,Stdmove,我有3个问题: 可以移动内置类型吗 a是否为无效值 可以移动指针吗 a会成为无效指针还是nullptr 可以移动c数组吗 结构{ int数组[10]; } S a; 根据 它完全等同于对右值引用类型的静态_转换 因此,它取决于在移动后分配给的变量的类型,如果该类型有构造函数或赋值运算符采用右值参数,则它可能会或可能不会窃取原始变量的内容,因此,它可能会使原始变量处于未指定状态: 除非另有规定,否则从中移动的所有标准库对象都将处于有效但未指定的状态 回到您的问题上来,因为对于内置的文本类型(如

我有3个问题:

  • 可以移动内置类型吗
  • a
    是否为无效值


  • 可以移动指针吗
  • a
    会成为无效指针还是
    nullptr


  • 可以移动c数组吗
  • 结构{
    int数组[10];
    }
    S a;
    
    根据

    它完全等同于对右值引用类型的静态_转换

    因此,它取决于在
    移动后分配给的变量的类型,如果该类型有
    构造函数
    赋值运算符
    采用右值参数,则它可能会或可能不会窃取原始变量的内容,因此,它可能会使原始变量处于
    未指定状态

    除非另有规定,否则从中移动的所有标准库对象都将处于有效但未指定的状态

    回到您的问题上来,因为对于内置的文本类型(如整数和原始指针),没有特殊的
    move构造函数
    move assign操作符
    ,因此,对于这些类型,它只是一个简单的副本。因此,对于问题1和问题2,
    a
    仍然有效,并且在
    移动后不会更改ECc++不允许C++数组的直接赋值,所以问题3中的代码不编译。
    ---编辑---

    您最初的第三个问题是将一个普通C数组分配给另一个数组,这是该语言不允许的

    您更新的第三个问题不同,它在一个结构中嵌入了一个C数组,现在您正在将一个结构分配给另一个结构,该结构现在可以编译。因为您的结构没有
    move assign操作符
    ,所以会调用默认的赋值操作符,该操作符执行字节级复制,因此,
    a
    在移动a之后保持不变第二次任务

    只有当结构的所有成员都是POD(纯旧数据)时才会发生这种情况。如果将非POD成员添加到结构中,赋值语句将不会编译,因为它不能使用默认的“字节级复制”赋值运算符来复制非POD成员(例如,字符串对象)


    好的,谢谢,我已经编辑了第三个问题,现在数组将成为struct s的成员,会发生什么?更新第三个问题中的代码很好,可以编译,a保持不变。我相应地更新了我的答案。最好添加第四个问题,而不是替换第三个问题,这样读者就不会感到困惑:-)。顺便说一句,你可以接受这个答案,如果它回答了你的问题,它会给其他读者一个明确的信号。
    int a = 10;
    int b = std::move(a);
    
    int *a = new int[10];
    int *b = std::move(a);
    
    struct S {
      int array[10];
    }
    S a;
    for(int i=0; i<10; i++)
      a.array[i]=1;
    S b;
    b = std::move(a);
    
    struct S {
      std::string something;  // non-POD member
      int array[100];
    };
    S a, b;
    b = std::move(a);  // this line will not compile