In der Regel willst du fast nie eine R-Value haben, außer du schreibst vllt. den Move-Konstruktor. Allerdings ist das nur meine Seite, wieder andere finden, dass man die Teile so oft wie möglich benutzen sollte. Es wird sicherlich noch seine Zeit dauern, bis wir als Community herausgefunden haben, wie man effizient so etwas benutzen kann und wann genau man es benutzen sollte. Um nochmal meinen Standpunkt zu zeigen, sind sie beispielsweise in
for-Loops überwiegend richtig unnötig und "schädlich", weil man die
constness aufgibt für... ja, wofür eigentlich? Weniger Tipperei? Es gibt aber wirklich nur richtig wenige Fälle, in denen
for(auto&& a : vec) einem
for(const auto& a : vec), durchaus auch zwanghaft, 'überwiegt'. Das ist Beispielsweise der Fall, wenn man einen
std::vector<bool> so durchlaufen möchte, wegen der tollen Proxy-Klasse
std::vector<bool>::reference... (das kompiliert dann ja erst, wenn man eine R-Value nimmt)
Ein äußerst nützliches Beispiel ist allerdings
std::forward_as_tuple, welches ein
std::tuple<Types&&...>(std::forward<Types>(args)...) zurückgibt. Dieses Tupel hat dann R-Value Referenzen als Member, wenn im Argument (von
std::forward_as_tuple) entsprechend auch R-Values verwendet wurden, und sonst L-Value Referezen. Das ist beispielsweise super für variadische Argumente, die man dann einfach in so ein Tupel klatschen und später re-expanden kann.
MfG
Check