Seit 2011 haben wir sowohl kopieren und verschieben Zuordnung. this answer argumentiert jedoch ziemlich überzeugend, dass für Ressourcenverwaltungsklassen nur ein Zuweisungsoperator benötigt wird. Für std::vector
zum Beispiel würde dies aussehenWarum hat std :: vector zwei Zuweisungsoperatoren?
vector& vector::operator=(vector other)
{
swap(other);
return*this;
}
Der wichtige Punkt hier ist, dass das Argument von Wert genommen wird. Dies bedeutet, dass in dem Moment, in dem der eigentliche Funktionskörper eingegeben wird, ein Großteil der Arbeit bereits durch die Konstruktion von other
erledigt wurde (wenn möglich durch move-Konstruktor, ansonsten durch Kopierkonstruktor). Daher implementiert dies sowohl die Kopier- als auch die Bewegungszuweisung automatisch korrekt.
Wenn dies richtig ist, warum wird (nach this documentation at least) std::vector
nicht auf diese Weise umgesetzt?
bearbeiten zu erklären, wie das funktioniert. Überlegen Sie, was in den obigen Code in den folgenden Beispielen zu other
geschieht
void foo(std::vector<bar> &&x)
{
auto y=x; // other is copy constructed
auto z=std::move(x); // other is move constructed, no copy is ever made.
// ...
}
I habe mich auch darüber gewundert. Kopieren und Tauschen scheint ziemlich genial. Vielleicht liegt es an alten Gründen, die Funktionssignatur genau gleich zu halten? Ich bin gespannt auf eine gute Antwort. – MicroVirus
Dies erfordert eine Speicherzuweisung. Das Kopieren von Inhalten aus einem L-Wert kann nicht erfolgen, wenn der Zessionar genügend Kapazität hat. – juanchopanza
@juanchopanza Ich dachte auch, dass. Wenn das so ist, dann ist die nette Antwort von GManNickG bei Locks nicht so schön? – Walter