繁体   English   中英

为什么除了在 Uref 实施例中对右值的引用之外,还允许 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 varS&类型是否已经是 const/reference。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM