C ++ Doppeladressenoperator? (&&)


137

Ich lese STL-Quellcode und habe keine Ahnung, was der &&Adressoperator tun soll. 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 der Adresse" sinnvoll? Warum gibt es zwei Adressoperatoren anstelle von nur einem?


2
Vielleicht ist es eine Adresse einer Referenz.
Gabe

1
@Gabe; Es ist eine Deklaration, die es zu einem Verweis auf einen Verweis machen würde, was keinen Sinn ergibt, da der Verweis selbst nicht geändert werden kann. Die Adresse von kann nur im Code verwendet werden, nicht beim Deklarieren (ein Parameter wie in diesem Fall oder auf andere Weise). Ich habe so etwas noch nie gesehen.
Falstro

5
Selbst wenn es nur einen einzigen &gäbe, hätte dies nichts mit der Adresse des Operators zu tun, sondern bedeutet, dass dies __xeine Referenz ist.
sepp2k

Antworten:



174

&&ist neu in C ++ 11. int&& abedeutet "a" ist eine r-Wert-Referenz. &&wird normalerweise nur verwendet, um einen Parameter einer Funktion zu deklarieren. Und es braucht nur einen r-Wert-Ausdruck. Wenn Sie nicht wissen, was ein r-Wert ist, ist die einfache Erklärung, dass er keine Speicheradresse hat. ZB sind die Zahl 6 und das Zeichen 'v' beide r-Werte. int aa ist ein l-Wert, ist jedoch (a+2)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.


11
Das einzige Beispiel, das Sie hinzufügen möchten, ist, wie dies mit std :: move funktioniert. Zeigen, was mit int&& c = std::move( b );usw. passieren würde
Zzzach ...

2
Es sieht so aus, als ob Sravani S am 15. Februar 2018 hier von Ihnen für TutorialsPoint offensichtlich plagiiert wurde .
Gabriel Staples

3
Ich habe gerade TutorialsPoint diese Nachricht gesendet . Der von ihnen plagiierte Artikel sieht so aus .
Gabriel Staples

86

&&ist neu in C ++ 11 und bedeutet, dass die Funktion eine RValue-Referenz akzeptiert, dh eine Referenz auf ein Argument, das zerstört werden soll.


@bronekk: Hast du das Post-Datum in dieser Nachricht gesehen? Es wurde nicht am 28. Dezember 2010 veröffentlicht.
Billy ONeal

Entschuldigung, jetzt entfernt. Wird beim nächsten Mal vorsichtiger sein :)
Bronekk

34

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

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

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

Beachten Sie, dass der Artikel immer noch ziemlich schwer zu lesen ist, sich aber lohnt. Und obwohl es sich um ein Microsoft VC ++ - Blog handelt, sind alle (oder fast alle) Informationen auf jeden C ++ 0x-Compiler anwendbar.


Das &&Token selbst ist nicht neu. seine Bedeutung in Erklärungen ist. Aber das wusstest du.
Aschepler

Es ist neu in diesem Zusammenhang. Es ist jedoch sehr traditionell, dass C / C ++ seine Token überlädt, um in verschiedenen Kontexten unterschiedliche Bedeutungen zu haben.
Martin York

1
@aschkleper - natürlich ... der logische und Operator kam mir nicht einmal in den Sinn. Ich werde die Antwort aktualisieren.
Michael Burr

5

Ich glaube, das ist ein Umzugsoperator. operator=ist beispielsweise der Zuweisungsoperator vector x = vector y. Der clear()Funktionsaufruf klingt so, als würde er den Inhalt des Vektors löschen, 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 dem Vektor a Werte gegeben haben, hat der Vektor b die Werte. Es ist die Magie der operator=()!

MSDN - So erstellen Sie einen Verschiebungskonstruktor


1
Was ist Ihre Antwort auf diese 4 Jahre alte Frage, die in den anderen Antworten noch nicht behandelt wurde?
Maskierter Mann

5
Ich habe keine solche Antwort bemerkt, also habe ich beschlossen, sie hinzuzufügen. Ich bin auf diese Frage gestoßen, als ich gerade heute gegoogelt habe.
Yash101
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.