2017-06-15 21 views
5

Mam szablonie klasy kontenera:Jawny konstruktor ruchu potrzebny w kontenerze?

template<class Stuff> 
class Bag{ 
    private: 
     std::vector<Stuff> mData; 
}; 

chcę zrobić

void InPlace(Bag<Array>& Left){ 
     Bag<Array> temp; 
     Transform(Left, temp); //fills temp with desirable output 
     Left = std::move(temp); 
    } 

Załóżmy tablica ma zdefiniowane przez użytkownika semantykę poruszać, ale Bag nie. Czy mData w tym przypadku zostanie przeniesiony lub skopiowany?

+0

dobry połów, ustalony – AGML

Odpowiedz

8

Zostałaby przeniesiona, a nie skopiowana.

Proponuję patrząc na poniższym obrazie:


enter image description here


To wyraźnie pokazuje, że kompilator niejawnie generuje ruch konstruktora dopóki użytkownik nie definiuje jego/jej:

  • destruktor
  • skopiować konstruktor
  • Przypisanie kopia
  • przypisanie ruch

Ponieważ klasa ma żadnej z tych zdefiniowanych przez użytkownika konstruktorów kompilator wygenerowany konstruktor ruch będzie zwanych, że konstruktor ruszy mData.

+0

Skąd ten ładny stolik? – zett42

+1

@ zett42 Zapomniałem, po prostu to kręcę. Jednak zrobiłem szybkie wyszukiwanie i jest to z prezentacji: https://stackoverflow.com/a/24512883/1870760 –

+3

Rzeczywista prezentacja: https://accu.org/content/conf2014/Howard_Hinnant_Accu_2014.pdf –

Powiązane problemy