为什么rvalue引用类型的模板参数可以绑定到左值类型?

时间:2018-04-19 03:24:42

标签: c++ forwarding-reference

据我所知,右值参考不能绑定到左值。 如,

void func(Foo &&f) {}
int main() {
 Foo f;
 func(f);
}

编译器抱怨:  错误:无法将'Foo&&'类型的右值引用绑定到'Foo

类型的左值

但是,为什么rvalue引用类型的模板参数可以绑定到左值? 如,

template <typename T> void funcTemp(T &&arg) {}
int main() {
 Foo f;
 funcTemp(f);
}

编译器不会抱怨错误。 为什么呢?

1 个答案:

答案 0 :(得分:2)

您可以阅读这篇文章Universal References in C++11来理解。这里有一部分内容:

  

如果声明变量或参数的某些推导类型 T的类型为 T&amp;&amp; ,则该变量或参数是通用参考。

Widget&& var1 = someWidget;      // here, “&&” means rvalue reference

auto&& var2 = var1;              // here, “&&” does not mean rvalue reference

template<typename T>
void f(std::vector<T>&& param);  // here, “&&” means rvalue reference

template<typename T>
void f(T&& param);               // here, “&&”does not mean rvalue reference

此处与您的案例相关excerpt from the Standard

  

...函数模板参数类型(称之为P)...如果P是转发引用且参数是左值,则使用类型“左值引用A”代替A来进行类型推导。 / p>