![](/img/trans.png)
[英]Why move return an rvalue reference parameter need to wrap it with std::move()?
[英]Why was it nessesury to allow std::move accept reference to rvalue besides reference to rvalue in Uref embodiment for both?
考虑到右值和左值不是对象的特征而是表达式的特征。
为什么std::move
不是仅针对左值引用参数实现的,而是针对通用参数实现的? 而它仅对从左值检索右值引用有用? 当 rvalue 已经是 rvalue 并且它不需要std::move
功能。
template <typename T>
typename std::remove_reference_t<T>&& move(T&& x)
{
return static_cast<std::remove_reference_t<T>&&>(x);
}
为什么 std::move 不是仅针对左值引用参数实现的,而是针对通用参数实现的?
因为对非常量的左值引用不能绑定到 xvalue。
当 rvalue 已经是 rvalue 并且它不需要 std::move 功能。
无论some_expression
是右值表达式还是左值表达式,我们都希望std::move(some_expression)
起作用。 这在模板中尤其重要,因为模板的细节可能取决于模板 arguments,我们不想为每个模板编写单独的特化。
与为什么允许这些基本相同的原因:
using T = const U;
const T var;
using S = T&;
S& ref = var;
在这种情况下,我们希望能够声明const T var
和S&
类型是否已经是 const/reference。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.