When Does Move Constructor get called?

前端 未结 3 1120
小蘑菇
小蘑菇 2020-12-02 09:24

I\'m confused about when a move constructor gets called vs a copy constructor. I\'ve read the following sources:

Move constructor is not getting called in C++0x

3条回答
  •  独厮守ぢ
    2020-12-02 10:08

    First of all, your copy constructor is broken. Both the copied from and copied to objects will point to the same Array and will both try to delete[] it when they go out of scope, resulting in undefined behavior. To fix it, make a copy of the array.

    a::a(const a& Old): Array(new int[5])
    {
      for( size_t i = 0; i < 5; ++i ) {
        Array[i] = Old.Array[i];
      }
    }
    

    Now, move assignment is not being performed as you want it to be, because both assignment statements are assigning from lvalues, instead of using rvalues. For moves to be performed, you must be moving from an rvalue, or it must be a context where an lvalue can be considered to be an rvalue (such as the return statement of a function).

    To get the desired effect use std::move to create an rvalue reference.

    A=C;              // A will now contain a copy of C
    B=std::move(C);   // Calls the move assignment operator
    

提交回复
热议问题