Weil vector<int>()
ein rvalue ist (ein temporäres, grob gesprochen ), und Sie können keine Nicht- const
-Referenz an einen R-Wert binden. In diesem Fall können Sie es nicht an eine Funktion übergeben, die eine nicht const
-Referenz verwendet.
Es ist jedoch vollkommen in Ordnung, Member-Funktionen auf Provisorien aufzurufen, weshalb das zweite Beispiel kompiliert wird.
Der Aufruf v1.swap(std::vector<int>())
versucht, ein temporäres (d. h. std::vector<int>()
) an eine nicht konstante Referenz zu binden. Dies ist illegal und schlägt fehl. Auf der anderen Seite ruft std::vector<int>().swap(v1)
eine nichtkonstante Funktion für das [non-const] Temporary auf, das erlaubt ist.
In C ++ 2011 hätte ich gedacht, dass die Deklaration in std::vector<T>::swap(T&&)
geändert würde, und es wäre somit in Ordnung, swap()
mit Provisorien zu verwenden (aber offensichtlich nicht mit const
-Objekten). Wie GMan darauf hingewiesen hat, ist dies nicht der Fall.
Tags und Links c++ vector swap temporary-objects