Die Unterscheidung zwischen rvalue Referenzen und Spedition Referenzen wurde von Scott Meyers in diesem Beispiel deutlich genug gemacht:Ist dies eine Weiterleitungsreferenz?
Widget&& var1 = someWidget; // here, “&&” means rvalue reference (1)
auto&& var2 = var1; // here, “&&” does not mean rvalue reference (2)
template<typename T>
void f(std::vector<T>&& param); // here, “&&” means rvalue reference (3)
template<typename T>
void f(T&& param); // here, “&&”does not mean rvalue reference (4)
Im Wesentlichen geschieht die Unterscheidung, wenn wir einen ableitbar Kontext haben, daher Fall (3) heißt es ausdrücklich, dass wir habe eine vector<...>&&
wobei die T
im Fall (4) abzuleiten ist und (nach Anwendung der Referenz-Kollabierungsregeln) in "Wertkategorie" kategorisiert wird.
Aber was passiert mit einem etwas komplexeren Mustervergleich? Nehmen Sie den folgenden Fall zum Beispiel:
template <template <class...> class Tuple, class... Ts>
void f(Tuple<Ts...>&& arg)
{
}
Was hier bedeutet &&
?
Deduzierbarer Kontext ist nicht wichtig. (3) und (4) sind beide ableitbar. – Oktalist