2012-01-15 7 views
8

Codice scende sotto:vettore <T> :: swap e oggetto temporaneo

#include <vector> 

int main() 
{ 
    vector<int> v1(5,1); 
    v1.swap(vector<int>()); //try to swap v1 with a temporary vector object 
} 

Il codice di cui sopra non può compilare, errore:

error: no matching function for call to ‘std::vector<int, std::allocator<int> >::swap(std::vector<int, std::allocator<int> >)’ 

Ma, se cambio il codice a qualcosa di simile, è può compilare:

int main() 
{ 
    vector<int> v1(5,1); 
    vector<int>().swap(v1); 
} 

Perché?

risposta

9

Perché vector<int>() è un rvalue (temporaneo, grosso modo) e non è possibile associare un riferimento non const a un valore. Pertanto, in questo caso, non è possibile passarlo a una funzione che utilizza un riferimento non const.

Tuttavia, è perfettamente utile invocare funzioni membro su provvisorie, motivo per cui viene compilato il secondo esempio.

+0

Potresti offrire maggiori informazioni su "' vector () 'è un valore"? 'rvalue' dovrebbe apparire sul lato destro di' = ', giusto? – Alcott

+0

@Alcott: è più generale di quello. Vedi http://en.wikipedia.org/wiki/Value_(computer_science). –

+0

Ho trovato questo articolo molto utile per capire i rvalues: http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html – Adam

6

La chiamata v1.swap(std::vector<int>()) tenta di associare un riferimento temporaneo (ad esempio std::vector<int>()) a un riferimento non const. Questo è illegale e fallisce. D'altra parte, l'utilizzo di std::vector<int>().swap(v1) chiama una funzione non const sul temporaneo [non-const], che è consentito.

In C++ 2011 sarebbe potuto pensare che la dichiarazione sarebbe cambiato per std::vector<T>::swap(T&&) e sarebbe quindi diventare OK per usare swap() con provvisori (ma, ovviamente, ancora non con const oggetti). Come ha sottolineato GMan, questo non è il caso.

+1

No, basta scambiare (T &) '. – GManNickG

Problemi correlati