Operatore doppio indirizzo C ++? (&&)


137

Sto leggendo il codice sorgente STL e non ho idea di cosa &&dovrebbe fare l'operatore di indirizzo. Ecco un esempio di codice da stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

"Indirizzo di indirizzo" ha senso? Perché ha due operatori di indirizzi anziché solo uno?


2
Forse è un indirizzo di riferimento.
Gabe,

1
@Gabe; è una dichiarazione in modo da renderlo un riferimento a un riferimento, il che non ha alcun senso poiché il riferimento stesso non può essere modificato. L'indirizzo di può essere utilizzato solo nel codice, non durante la dichiarazione (un parametro come in questo caso o in altro modo). Non ho mai visto niente del genere però.
falstro,

5
Anche se ce n'era solo uno &, non avrebbe nulla a che fare con l'operatore dell'indirizzo, ma significa invece che __xè un riferimento.
sepp2k,

Risposte:


112

Questo è il codice C ++ 11 . In C ++ 11, il &&token può essere utilizzato per indicare un "riferimento di valore".


175

&&è nuovo in C ++ 11. int&& asignifica "a" è un riferimento di valore r. &&viene normalmente utilizzato solo per dichiarare un parametro di una funzione. E richiede solo un'espressione di valore r. Se non sai cos'è un valore r, la semplice spiegazione è che non ha un indirizzo di memoria. Ad esempio il numero 6 e il carattere 'v' sono entrambi valori r. int a, a è un valore l, tuttavia (a+2)è un valore r. Per esempio:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

Spero che sia informativo.


11
L'unico esempio che vorrei aggiungere è come funziona con std :: move. Mostrando cosa succederebbe int&& c = std::move( b );, ecc.
Zzzach ...

2
Sembra che Sravani S sia palesemente plagiato da te per TutorialsPoint il 15 febbraio 2018, qui .
Gabriel Staples,

3
Ho appena inviato a TutorialsPoint questo messaggio . L'articolo, come plagiato da loro, assomiglia a questo .
Gabriel Staples,

86

&&è una novità di C ++ 11 e indica che la funzione accetta un RValue-Reference , ovvero un riferimento a un argomento che sta per essere distrutto.


@bronekk: hai visto la data del post su questo messaggio? Non è stato pubblicato il 28 dicembre 2010.
Billy ONeal

scusami, rimosso ora. La prossima volta
starò

34

Come menzionato da altre risposte, il &&token in questo contesto è nuovo in C ++ 0x (il prossimo standard C ++) e rappresenta un "riferimento di valore".

I riferimenti ai valori sono una delle novità più importanti nel prossimo standard; consentono il supporto per la semantica "sposta" sugli oggetti e consentono l'inoltro perfetto delle chiamate di funzione.

È un argomento piuttosto complesso - una delle migliori introduzioni (che non è solo una frase) è un articolo di Stephan T. Lavavej, "Riferimenti di valore: C ++ 0x Funzionalità in VC10, Parte 2"

Si noti che l'articolo è ancora piuttosto pesante da leggere, ma vale la pena. E anche se si trova su un blog Microsoft VC ++, tutte (o quasi) le informazioni sono applicabili a qualsiasi compilatore C ++ 0x.


Il &&token stesso non è nuovo; il suo significato nelle dichiarazioni è. Ma lo sapevi.
aschepler,

È nuovo in questo contesto. Ma è molto tradizionale che C / C ++ sovraccarichi i suoi token per avere un significato diverso in contesti diversi.
Martin York,

1
@aschkleper - ovviamente ... l'operatore logico e non mi è nemmeno entrato nella mente. Aggiornerò la risposta.
Michael Burr,

5

Credo che sia un operatore di movimento. operator=è l'operatore di assegnazione, diciamo vector x = vector y. La clear()chiamata di funzione suona come se stesse eliminando il contenuto del vettore per evitare una perdita di memoria. L'operatore restituisce un puntatore al nuovo vettore.

Per di qua,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

Anche se abbiamo dato valori vettoriali a, il vettore b ha i valori. È la magia del operator=()!

MSDN - Come creare un costruttore di spostamento


1
Qual è la tua risposta aggiunta a questa domanda di 4 anni, che non è già stata trattata nelle altre risposte?
Masked Man il

5
Non ho notato alcuna risposta come questa, quindi ho deciso di aggiungere. Mi sono imbattuto in questa domanda su Google proprio oggi.
yash101,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.