2016-04-17 11 views
1

Ich habe einen Vektor wie folgt aus:C++ keine passende Funktion für Aufruf Vektor push_back

std::vector<std::unique_ptr<Service> > m_vec; 

Ich kann wie folgt ausführen push_back:

m_vec.push_back(std::make_unique<Service>()); 

Aber wenn ich es wie folgt aus:

std::unique_ptr<Service> pt = std::make_unique<Service>(); 
m_vec.push_back(pt); 

ich habe Fehler no matching function for call to ‘std::vector<std::unique_ptr<Service> >::push_back(std::unique_ptr<Service>&)

Bedeutet &, dass ich einen Verweis auf den Vektor dränge? Wenn ja, warum kann ich keine Referenz drücken?

+0

Ihr zweites Beispiel versucht, eine * Kopie * von 'pt' zu machen, die nicht geht Arbeit als 'unique_ptr's Kopierkonstruktor wird gelöscht. – user657267

+0

Ein weiteres Duplikat: [Was ist die korrekte Verwendung von std :: unique_ptr während des Push-Vorgangs in std :: vector] (http://stackoverflow.com/q/14484183/514235). – iammilind

Antwort

4

std::unique_ptr konnte nicht kopiert werden, nur bewegt werden kann.

Die Klasse erfüllt die Anforderungen von MoveConstructible und MoveAssignable, aber nicht die Anforderungen entweder CopyConstructible oder CopyAssignable.

std::make_unique<Service>() ist eine temporäre Variable und könnte als R-Wert genommen werden und bewegt werden, aber man kann die gleiche Sache mit einer benannten Variablen nicht. Sie können std::move verwenden:

std::move verwendet wird, um anzuzeigen, dass ein Objekt t werden

Wie,

m_vec.push_back(std::move(pt)); 
+0

danke für die antwort, wenn ich move rufe, kann ich noch pt wiederverwenden? Oder existiert es nicht mehr? – user4016367

+0

@ user4016367 Es dpends auf, was meinst du mit „Wiederverwendung pt“, nach bewegt, hat der Besitz von 'pt' dem Element' m_vec' übertragen worden ist, es selbst nichts. – songyuanyao

+0

Ich möchte m_vec auch das Eigentum behalten, wie es geht? – user4016367

1
"aus bewegt" kann

, was Sie wollen, ist

std::unique_ptr<Service> pt = std::make_unique<Service>(); 
m_vec.emplace_back(std::move(pt)); 

Sie unique_ptr nicht kopieren können, da sie einzigartig sind. Sie können einen erstellen und dann bewegen es herum. emplace_back wird sicherstellen, dass keine temporories gemacht werden, und das Element wird in-place (ohne Kopien, temporeries usw.)

Verwandte Themen