2013-07-05 11 views
9

Wspólny wzór w C++ jest, aby prywatny konstruktor kopia:Czy konstruktor prywatnego ruchu uniemożliwia przeniesienie?

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
}; 

Ale następujący kod następnie skompilować (w C++ 11/14):

A f(); 

auto a = f(); 

Standard zawiera informacje o automatycznym generowaniu konstruktorów ruchu. Nie mam dostępu do standardu ani kompilatora, który faktycznie generuje konstruktory ruchu. Moje pytanie brzmi: czy muszę napisać:

class A 
{ 
    public: 
     // ... 
    private: 
     A(const A&); 
     A(const A&&); 
}; 

, aby zapobiec poruszaniu się (i operatorom = analogicznie)?

+1

Jeśli napiszesz konstruktor kopiowania, to nie wygenerujesz konstruktora ruchu. –

+2

Użytkownik deklarujący kopię ctor zapobiega generowaniu elementów przenoszenia. – Xeo

+3

Zauważ, że wzorzec, do którego odnosisz się jest przeznaczony dla C++ 98/03, ale jest teraz przestarzały w C++ 11 dzięki możliwości 'delete' konstruktorów/operatorów przypisania (np.' ClassName (ClassName &&) = delete; 'jawnie zapobiegać niejawnemu konstruktorowi ruchu). – syam

Odpowiedz

13

Ale następujący kod następnie skompilować (w C++ 11/14):

Nie, to nie będzie. Obecność deklarowanego przez użytkownika konstruktora kopiowania powinna zahamować niejawne generowanie konstruktora ruchu. Zgodnie z pkt 12.8/9 o C++ 11 Standard:

Jeżeli definicja klasy X nie jawnie zadeklarować konstruktor poruszać, jeden będzie niejawnie zadeklarowana jako domyślnie wtedy i tylko wtedy

- X nie posiada kopiującym użytkownika uznane,

- X nie posiada operatorowi przypisanie kopii zadeklarowane przez użytkownika,

- X nie posiada ruch operatorowi przypisanie użytkownika uznane,

- X nie posiada destruktor użytkownika zadeklarowane i

- konstruktor posunięcie nie być domyślnie zdefiniowany jako usunięte.

+0

Świetnie! Jeszcze raz jestem pod wrażeniem TAK! :-) – Petter

+0

@Ben: Cieszę się, że pomogło :) –

Powiązane problemy