Frage C ++ Doppeladressenoperator? (&&)


Ich lese den STL-Quellcode und habe keine Ahnung was && Adresse Betreiber soll tun. Hier ist ein Codebeispiel von stl_vector.h:

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

Ist "Adresse" sinnvoll? Warum hat es zwei Adressoperatoren statt nur einer?


75
2017-12-28 20:14


Ursprung


Antworten:


Das ist C ++ 11 Code. In C ++ 11, der && Token kann verwendet werden, um eine "R-Wert-Referenz" zu bezeichnen.


79
2017-12-28 20:16



&& ist neu in C ++ 11 und zeigt an, dass die Funktion ein akzeptiert RValue-Referenz Das ist ein Verweis auf ein Argument, das zerstört werden soll.


66
2017-12-28 20:16



&& ist neu in C ++ 11. int&& a bedeutet "a" ist eine r-Wert-Referenz. && wird normalerweise nur zum Deklarieren eines Parameters einer Funktion verwendet. Und es nur nimmt einen r-Wert-Ausdruck an. Wenn Sie nicht wissen, was ein r-Wert ist, besteht die einfache Erklärung darin, dass er keine Speicheradresse hat. Z.B. die Zahl 6 und das Zeichen 'v' sind beide r-Werte. int a, a ist jedoch ein I-Wert (a+2) ist ein r-Wert. Beispielsweise:

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

Hoffe das ist informativ.


46
2017-09-13 23:05



Wie andere Antworten erwähnt haben, hat die && token ist in diesem Zusammenhang neu in C ++ 0x (dem nächsten C ++ - Standard) und repräsentiert eine "rvalue reference".

Rvalue-Referenzen sind eine der wichtigeren Neuerungen im kommenden Standard; Sie ermöglichen die Unterstützung von "Verschieben" -Semantiken für Objekte und ermöglichen eine perfekte Weiterleitung von Funktionsaufrufen.

Es ist ein ziemlich komplexes Thema - eine der besten Einführungen (das ist nicht nur oberflächlich) ist ein Artikel von Stephan T. Lavavej, "Rvalue-Verweise: C ++ 0x-Features in VC10, Teil 2"

Beachten Sie, dass der Artikel immer noch recht schwer zu lesen ist, aber es lohnt sich. Und obwohl es in einem Microsoft VC ++ - Blog ist, sind alle (oder fast alle) Informationen für jeden C ++ 0x-Compiler anwendbar.


26
2017-12-28 20:29



Ich glaube, das ist ein Move-Operator. operator= ist der Zuweisungsoperator, sagen wir vector x = vector y. Das clear() Der Funktionsaufruf klingt so, als würde er den Inhalt des Vektors löschen, um ein Speicherleck zu vermeiden. Der Operator gibt einen Zeiger auf den neuen Vektor zurück.

Diesen Weg,

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

Obwohl wir dem Vektor Werte gegeben haben, hat Vektor b die Werte. Es ist die Magie der operator=()!

MSDN - Erstellen eines Verschiebungskonstruktors


1
2017-12-23 16:43