2012-06-12 19 views
6

Według standardu C++ 11 konstruktor domyślny ruch jest generowany tylko wtedy, gdy:Jawnie domyślnie konstruktor ruch

  • X nie posiada konstruktor kopiujący użytkownika zadeklarowane i
  • X nie mają zadeklarowane przez użytkownika operator przypisania kopiowanie,
  • X nie posiada operator przypisania ruch użytkownika oświadczył
  • X nie posiada destruktor użytkownika zadeklarowane i
  • konstruktor posunięcie nie może być określona w sposób dorozumiany jako usunięte.

Czy mogę nadal domyślnie go ustawić? Wydaje się działać poprawnie w klang. Jak to na przykład:

class MyClass { 
private: 
    std::vector<int> ints; 
public: 
    MyClass(MyClass const& other) : ints(other.ints) {} 
    MyClass(MyClass&& other) = default; 
}; 

Odpowiedz

10

Motywacją dla tej zasady jest to, że jeśli konstruktor domyślny kopia nie działa dla swojej klasy, to są szanse, konstruktor domyślny ruch nie będzie działać albo (zasada 5, lub cokolwiek robimy w C++ 11). Tak, możesz to jawnie ustawić domyślnie, na twoją cześć jako programista, który będzie działał.

W przykładowym kodzie można zamiast tego usunąć konstruktor kopiowania, ponieważ działa on tak samo jak domyślny.

3

Tak, zawsze można jawnie wywołać domyślną generację dla funkcji, które można automatycznie wygenerować za pomocą = default. Do tego służy składnia.

Powiązane problemy