为什么右值引用类型的模板参数可以绑定到左值类型?
Why a template argument of a rvalue reference type can be bound to a lvalue type?
据我所知,右值引用不能绑定到左值。
例如,
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);
}
编译器不会报错。
为什么?
你可以阅读这篇文章Universal References in C++11来理解。这是它的一部分:
If a variable or parameter is declared to have type T&& for some deduced type T, that variable or parameter is a universal reference.
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:
... function template parameter type (call it P) ... If P is a forwarding reference and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction.
据我所知,右值引用不能绑定到左值。 例如,
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);
}
编译器不会报错。 为什么?
你可以阅读这篇文章Universal References in C++11来理解。这是它的一部分:
If a variable or parameter is declared to have type T&& for some deduced type T, that variable or parameter is a universal reference.
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:
... function template parameter type (call it P) ... If P is a forwarding reference and the argument is an lvalue, the type “lvalue reference to A” is used in place of A for type deduction.