2013-05-17 4 views
5

Sto leggendo la "Libreria standard C++ (Seconda edizione)" di Nicolai M. Josuttis e ho appena raggiunto la sezione std::pair. L'autore osserva che:Perché lo standard di classe std :: pair è stato modificato per disabilitare i tipi con solo un costruttore di copia non costante in C++ 11?

Poiché C++ 11, un pair<> utilizzando un tipo che ha solo un costruttore di copia non costante non verrà più compilato.

Si passa poi a dare l'esempio seguente:

class A 
{ 
    public: 
    ... 
    A(A&); // copy constructor with nonconstant reference 
    ... 
}; 

std::pair<A, int> p; // Error since C++11 

Tuttavia, mi interessa il motivo per cui la commissione standard ha deciso di fare questo emendamento alla norma libreria standard? Ho cercato di google la ragione, ma non ha avuto successo nel trovare qualcosa di pertinente.

+1

Avrei dovuto supporre che si intendesse sempre usare const per promettere all'utente di conservare il contenuto della coppia, e C++ 11 era in grado di adattarlo allo standard attuale. –

risposta

4

In C++ 98, i costruttori di copia con parametri di riferimento non costante sarebbero (ab)used to "move" elements in giro. Tale codice era notoriamente pericoloso e poco chiaro. Il famigerato e ora deprecated std::auto_ptr ne fu il primo esempio.

In C++ 11, abbiamo move semantics e riferimenti di valore per ottenere gli stessi effetti in modo molto più sicuro e chiaro. Questo perché un riferimento di rvalue è un riferimento a un oggetto mutabile, ma può legarsi solo a espressioni "sicure" come temporaries o cose che hai espressamente lanciato (via std::move) e quindi contrassegnato come "usa e getta".

In breve: le classi con i costruttori di copie che prendono membri non di riferimento non hanno casi di utilizzo reali che non possono essere eseguiti in modo migliore e più sicuro con i riferimenti di valore. std::pair acquisito un costruttore di traslochi std::pair(std::pair&&)=default per ospitare tale semantica.

Problemi correlati