双重移动同一个对象是从左到右复制?

Rup*_*av. 4 c++ move move-semantics c++11 move-assignment-operator

我只是初学者在c ++ 11中的移动操作,所以玩它.但发现了一些我无法理解的东西.

#include <iostream>
using namespace std;

class A{
    public:
        A(){cout << "default ctor" << endl;}
        A(const string& str):_str{str}{cout << "parameter ctor" << endl;}
        A(A&& obj):_str{std::move(obj._str)}{cout << "move ctor" << endl;}
        A& operator =(A&& rhs){_str = std::move(rhs._str);cout << "move assignment operation" << endl; return *this;}
        void print(){cout << _str << endl;}
    private:
        string _str;
};

int main(){
    A a("rupesh yadav"); // parameter ctor
    A b(std::move(a));   // move ctor

    cout << "print a: ";
    a.print();           // NOT printing  --> CORRECT!!
    cout << "print b: ";
    b.print();           // printing      --> CORRECT!!

    b = std::move(a);    // i don't know may be silly but still lets do it WHY NOT!!!, could be just mistake??

    cout << "print a: "; 
    a.print();           // printing      --> WRONG!! 
    cout << "print b: "; 
    b.print();           // NOT printing  --> WRONG!!
}
Run Code Online (Sandbox Code Playgroud)

我期待该b = std::move(a)操作会表现不同的东西,因为我申请对象移动一个第二时间,但它是复制左侧对象b到右侧对象一个,这部分我不明白.

或者我在编程方面做错了.如果我在移动操作中做错了,请帮忙.

编辑:我知道这是未定义的行为.我怀疑的是,如果我再次这样做,那么它是从对象a复制到对象b,如果我再次做同样的事情,那么将对象b复制到对象a

因此,它是从左到右,从右到左复制形式为什么?

Lig*_*ica 5

您不能两次从同一个对象移动.

当您第一次移动ab,a有一个"有效的,但不确定状态"(不记得确切的术语).然后,你试图再次a进入!现在所有的一切都已经破裂了.(我怀疑,在内部,数据指针刚刚交换过.)b

根本不要这样做.我认为没理由这么做.

  • @RupeshYadav:移动(可能)修改源和目标,并以未指定的方式修改源.所以你真的不应该期待从物体移动的内容(无论你多久移动一次) (2认同)