C++ dubbele adresoperator? (&&)

Ik ben de STL-broncode aan het lezen en ik heb geen idee wat de adresoperator van &&moet doen. Hier is een codevoorbeeld van stl_vector.h:

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

Heeft ‘Adresadres’ enige zin? Waarom heeft het twee adresoperators in plaats van slechts één?


Antwoord 1, autoriteit 100%

Dit is C++11-code. In C++11 kan het token &&worden gebruikt om een “rvalue-referentie” aan te duiden.


Antwoord 2, autoriteit 91%

&&is nieuw in C++11. int&& abetekent dat “a” een r-waardereferentie is. &&wordt normaal gesproken alleen gebruikt om een parameter van een functie te declareren. En het heeft alleeneen r-waarde-expressie nodig. Als u niet weet wat een r-waarde is, is de eenvoudige verklaring dat deze geen geheugenadres heeft. bijv. het getal 6 en het teken ‘v’ zijn beide r-waarden. int a, a is een l-waarde, maar (a+2)is een r-waarde. Bijvoorbeeld:

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.
}

Ik hoop dat dit informatief is.


Antwoord 3, autoriteit 74%

&&is nieuw in C++ 11, en het betekent dat de functie een Rvalue-referentie – dat wil zeggen, een verwijzing naar een argument dat op het punt staat te worden vernietigd.


Antwoord 4, Autoriteit 29%

Zoals andere antwoorden hebben genoemd, is de &&token in deze context nieuw op C++ 0x (de volgende C++ -standaard) en vertegenwoordigen een “RVALUE REFERVECTION”.

Rvalue-referenties zijn een van de belangrijkste nieuwe dingen in de aankomende norm; Ze maken ondersteuning voor ‘Verplaats’ semantiek op objecten en vergun je een perfecte doorsturen van functie-oproepen.

Het is een nogal complex onderwerp – een van de beste introducties (dat is niet alleen cursory) is een artikel van Stephan T. Lavavej, ” RVALUE REFERENTIES: C++ 0X-functies in VC10, Deel 2 “

Merk op dat het artikel nog steeds vrij zwaar is, maar de moeite waard. En hoewel het op een Microsoft VC++ blog is, is alle (of bijna allemaal) de informatie van toepassing op elke C++ 0x-compiler.


Antwoord 5, Autoriteit 4%

Ik geloof dat dat is een verplaatsingsoperator. operator=is de opdrachtoperator, zeggen vector x = vector y. De clear()FUNCTION CALL klinkt alsof het de inhoud van de vector verwijdert om een ​​geheugenlek te voorkomen. De operator retourneert een aanwijzer naar de nieuwe vector.

op deze manier,

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

Hoewel we vector a-waarden hebben gegeven, heeft vector b de waarden. Het is de magie van de operator=()!

MSDN — Een verplaatsingsconstructor maken

Other episodes