【发布时间】:2017-04-10 16:26:44
【问题描述】:
在 Scott Meyers 的这个例子中,右值引用和转发引用之间的区别已经很清楚了:
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) 都是可演绎的。
标签: c++ c++11 perfect-forwarding forwarding-reference