entfernen unique_ptr aus der Warteschlange
Ich versuche, herauszufinden, wie/ob ich die verwenden kann unique_ptr
im queue
.
//create queue
std::queue<std::unique_ptr<int>> q;
//add element
std::unique_ptr<int> p (new int{123});
q.push(std::move(p));
//try to grab the element
auto p2 = foo_queue.front();
q.pop();
Verstehe ich, warum der code oben nicht funktioniert. Da die front
& pop
2 separate Schritte, das element kann nicht verschoben werden. Gibt es eine Möglichkeit, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie ausdrücklich sagen, Sie wollen bewegen den Zeiger aus der Warteschlange. Wie diese:
q.front()
gibt ein l-Wert, so kann man nicht kopieren, initialisierenp2
mit ihm, weilunique_ptr
s sind nicht kopierbar.std::move
konvertiert es in ein r-Wert, so, jetztp2
wird move-initialisiert statt, was erlaubt ist by design.front
zurückkehren dürfe es als einel-value
.unique_ptr
wurde zurückgegeben Wert.move
, das oberste element in derqueue
ist einunique_ptr
gleichnullptr
. Der pop ist erforderlich, um diese zu entfernen "leer"unique_ptr
von derqueue
.front()
und dann löschen Sie und vergessen Sie es. Auch in C++03 könnte man nicht implementieren, eine effiziente Rückkehr von Wert fürpop()
.