2013-11-07 3 views
0

вот что я получил:Переместить семантику, почему не вызван конструктор перемещения?

class A { 
    class B{ 
     A* owner; 
     B(A* owner){ 
      this->owner = owner; 
     } 
     B(B&& second) 
      : owner(std::move(second.owner)); 
     {} 

     B& operator=(B&& second){ 
      this->owner = second.owner; 
     } 
    }; 

    B* object; 
    int a; 
    string b; 

    A(int a, string b){ 
     this->a = a; 
     this->b = b; 
     object = nullptr; 
    } 

    void create_B(){ 
     if(object == nullptr) 
      object = new B(this); 
    } 

    A& operator=(A&& second){ 
     this->a = second.a; 
     this->b = second.b; 
     this->object = std::move(second.object); 
     second.object = nullptr; 
     return *this; 
    } 

    A(A&& second) 
     : a(second.a) 
     , b(second.b) 
     , object(std::move(second.object)){ 
     second.object = nullptr; 
    } 
}; 

Теперь то, что меня беспокоит то, что когда я делаю что-то вроде этого:

A a1(2, "aaa"), a2(3, "bbb"); 
a1.create_B(); 
swap(a1, a2); 

все меняется, это место правильно (переместить и переместить конструкторами назначения называются должным образом), но владелец B не изменился (хотя я бы хотел, чтобы он изменился на a2, поскольку мы поменялись местами).

Почему здесь нет конструктора назначения перемещения/перемещения назначения B? Спасибо заранее!

ответ

0

Поскольку поле object перемещается (копируется) как указатель.

0

Конструктор перемещения B не вызывается, потому что вы перемещаете B * (указатель на B), а не B. Попробуйте определить объект как экземпляр B.

Смежные вопросы