vectorT :: swap und temporäres Objekt

8

Code geht unter:

%Vor%

Der obige Code kann nicht kompiliert werden, Fehler:

%Vor%

Aber, wenn ich den Code in etwas wie das ändern, kann es kompilieren:

%Vor%

Warum?

    
Alcott 15.01.2012, 03:18
quelle

2 Antworten

9

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.

    
Oliver Charlesworth 15.01.2012, 03:22
quelle
6

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.

    
Dietmar Kühl 15.01.2012 03:25
quelle

Tags und Links