![](/img/trans.png)
[英]Passing an lvalue to rvalue template parameter won't allow me to declare const T& var
[英]Why does a T&& parameter preserves the constness and lvalue/rvalue property of the argument while a T& doesn't
我刚刚在 C++ Primer 中读过这个:
作为对模板类型参数(即 T&&)的右值引用的函数参数保留其对应参数的常量性和左值/右值属性。
但我不明白为什么 T&& 参数有这个功能,而 T& 没有。
这背后的 C++ 逻辑是什么?
因为如果T
是函数模板参数,则T&
是对T
的非常量引用,而T&&
如果用作函数参数的类型,则称为转发引用。 其他T&&
,例如template<typename T> void foo(std::vector<T&&> x)
实际上是一个不能推导出 const 的 r-value 引用(不是 const r-value 引用非常有用)。
因为我们想自动区分以下情况:
const int x = 5; foo(x);
int x = 5; foo(std::move(x));
int x = 5; foo(x);
foo(int{5})
; 在保留单个template<typename T> foo(T&& x)
定义的同时,转发引用被赋予推断const
的能力。
至于为什么T&
不能推断const
,它可能从来都不是这个功能的意图。 它实际上是作为对泛型类型的非常量引用。 这会使x.non_const_member()
有时无法编译。
是的, T&&
也会发生这种情况,但这里的意图正是将传递给我们的类型转发到其他地方,而不一定要自己修改对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.