move constructor and std::move confusion

前端 未结 2 1072
孤街浪徒
孤街浪徒 2021-02-08 02:21

I am reading about the std::move, move constructor and move assignment operator. To be honest, all I got now is confusion. Now I have a class:

class A{
  public:         


        
2条回答
  •  鱼传尺愫
    2021-02-08 02:58

    You have to understand that std::move does not move anything, but "marks" its argument to be a rvalue reference. Technically, it converts the type to a rvalue reference. Then, the rvalue reference it's being moved by the corresponding move constructor or move assignment operator. For objects that contain only members with trivial move ctors/assignment operators, the move ctor/assignment operator is trivial and simply copies. In general, the move ctor/assignment operator of the object calls the move ctor/assignment operator of all its members.

    So, whenever you write

    int x = 10;
    int y = std::move(x); 
    

    on the right hand side of the assignment y = std::move(x), you have a rvalue reference of type int&&. However, int does not have a non-trivial move ctor, and the rvalue is simply copied into y, nothing is changed in x.

    On the other hand,

    string s = "some string";
    string moved_s = std::move(s); // here we tell the compiler that we can "steal" the resource of s
    

    is different. The move constructor of moved_s kicks in, and "steals" (i.e. swaps internal pointers etc) the resource of s, because the latter is a rvalue reference. At the end, s will not contain any element.

提交回复
热议问题