这是转发参考吗?

Lor*_*ins 20 c++ perfect-forwarding c++11 forwarding-reference

在这个例子中,Scott Meyers明确了rvalue引用和转发引用之间的区别:

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)
Run Code Online (Sandbox Code Playgroud)

本质上,当我们有一个可推导的上下文时就会出现这种区别,因此案例(3)明确表明我们有一个,vector<...>&&T案例(4)是要推断的,并且(在应用参考折叠规则之后)按"价值类别"分类.

但是更复杂的模式匹配会发生什么?以下面的情况为例:

template <template <class...> class Tuple, class... Ts>
void f(Tuple<Ts...>&& arg)
{

}
Run Code Online (Sandbox Code Playgroud)

&&这里的意思是什么?

Ker*_* SB 16

在上一个示例中,arg是一个右值引用.

转发参考是一个rvalue参照CV-不合格模板参数

并且Tuple<Ts...>不是模板参数.

(来自[temp.deduct.call]的引文.)


Rak*_*111 11

它是右值引用,而不是转发引用.

最简单的方法是尝试传递一个左值,如果失败,那么它是一个右值引用,如果没有,那么转发引用:

template<typename... Ts>
struct foo {};

//f function definition

int main() {
    foo<int, double> bar;
    f(bar); // fails! Cannot bind lvalue to rvalue reference
    f(foo<int, double>{}); // ok, rvalue is passed
}
Run Code Online (Sandbox Code Playgroud)