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?