webentwicklung-frage-antwort-db.com.de

C ++ Double Address Operator? (&&)

Ich lese STL-Quellcode und habe keine Ahnung, was && Adressoperator 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 "Address of Address" sinnvoll? Warum hat es zwei Adressoperatoren anstelle von nur einem?

108
Anarki

Dies ist C++ 11 Code. In C++ 11 wird das && Token kann verwendet werden, um eine "rWert-Referenz" zu bedeuten.

94
aschepler

&& 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 braucht einen r-Wert Ausdruck. Wenn Sie nicht wissen, was ein r-Wert ist, ist die einfache Erklärung, dass er keine Speicheradresse hat. Z.B. Die Zahl 6 und das Zeichen 'v' sind beide r-Werte. int a, a ist ein l-Wert, jedoch (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.

119
Lexseal Lin

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

81
Billy ONeal

Wie andere Antworten bereits erwähnt haben, ist der &&-Token ist in diesem Kontext neu in C++ 0x (dem nächsten C++ - Standard) und stellt eine "rWert-Referenz" dar.

R-Wert-Referenzen sind eine der wichtigsten Neuerungen im kommenden Standard. Sie ermöglichen die Unterstützung der Bewegungssemantik von Objekten und die perfekte Weiterleitung von Funktionsaufrufen.

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

Beachten Sie, dass der Artikel immer noch ziemlich ausführlich gelesen wird, sich aber lohnt. Und obwohl es sich um ein Microsoft VC++ - Blog handelt, gelten alle (oder fast alle) Informationen für jeden C++ 0x-Compiler.

29
Michael Burr

Ich glaube das ist ein Umzugsoperator. operator= Ist der Zuweisungsoperator, sagen wir vector x = vector y. Der Funktionsaufruf clear() hört sich so an, als würde der Inhalt des Vektors gelöscht, um einen Speicherverlust zu verhindern. 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 Vektor a Werte gegeben haben, hat Vektor b die Werte. Es ist die Magie des operator=()!

MSDN - Erstellen eines Verschiebungskonstruktors

1
yash101