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&& a
betekent 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=()
!