右值引用和转发引用之间的区别作出足够清楚在这个例子斯科特迈尔斯:这是一个转发参考?
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)
本质上的区别发生时,我们有一个抵扣方面,因此情况(3)明确规定,我们具有vector<...>&&
,而情况(4)中的T
将被推断并且(在应用参考折叠规则之后)按照“价值类别”进行分类。
但是,有点复杂的模式匹配会发生什么?就拿下面的情况:
template <template <class...> class Tuple, class... Ts>
void f(Tuple<Ts...>&& arg)
{
}
是什么意思&&
这里?
可推论的上下文并不重要。 (3)和(4)都可以推导出来。 – Oktalist