Avatar ·

Was bedeutet T&& (doppeltes kaufmännisches Und) in C++11?

Hallo Kollegen! Ich habe angefangen, C++11 zu lernen, und bin auf eine seltsame Syntax gestoßen — das doppelte kaufmännische Und `&&` in Funktions- und Template-Parameterdeklarationen. Zum Beispiel habe ich diesen Code gesehen: ```cpp template void foo(T&& arg) { // irgendein Code } ``` Oder hier in der Implementierung eines move-Konstruktors: ```cpp class MyClass { public: MyClass(MyClass&& other) noexcept; }; ``` Ich verstehe, dass ein einzelnes `&` eine Referenz (lvalue-reference) ist. Aber was macht das doppelte kaufmännische Und? Im Internet steht, dass es sich um eine "rvalue-reference" handelt, aber mir ist nicht ganz klar, wie sich das von einer normalen Referenz unterscheidet und wozu es dient. Anscheinend hängt es mit der Move-Semantik (move semantics) und der perfekten Weiterleitung (perfect forwarding) zusammen, aber ich kann mir kein vollständiges Bild machen. Könnt ihr es anhand einfacher Beispiele erklären? Besonders interessiert mich: 1. Wie funktioniert `T&&` in Templates — ist es immer ein rvalue oder nicht? 2. Warum sagt man manchmal, dass `T&&` sowohl ein lvalue als auch ein rvalue sein kann? 3. Wie verwendet man `std::move` und `std::forward` zusammen?