2

据我所知,右值引用不能绑定到左值。例如,

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

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

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

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

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

4

1 回答 1

4

你可以阅读这篇文章Universal References in C++11来理解。这是其中的一部分:

如果一个变量或参数被声明为具有某个推导类型T 的类型T&&,则该变量或参数是一个通用引用。

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

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

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

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

这是与您的案例相关的标准摘录

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

于 2018-04-19T05:08:15.750 回答