为什么除了在 Uref 实施例中对右值的引用之外,还必须允许 std::move 接受对左值的引用?

Why was it nessesury to allow std::move accept reference to lvalue besides reference to rvalue in Uref embodiment for both?

考虑到右值和左值不是对象的特征而是表达式的特征。

为什么 std::move 不只为左值引用参数实现,而是为通用参数实现?而它仅对从左值检索右值引用有用?当右值已经是右值并且不需要 std::move 功能时。

template <typename T>
typename std::remove_reference_t<T>&& move(T&& x)
{
  return static_cast<std::remove_reference_t<T>&&>(x);
}

Why isn't std::move implemented only for lvalue reference argument, but for universal one?

因为对非常量的左值引用不能绑定到 xvalues。

When rvalue is rvalue already and it does not need std::move functionality.

我们希望 std::move(some_expression) 无论 some_expression 是右值表达式还是左值表达式都有效。这在模板中尤为重要,因为模板的细节可能取决于模板参数,我们不想为每个模板编写单独的特化。

与允许这些的原因基本相同:

using T = const U;
const T var;

using S = T&;
S& ref = var;

在这种情况下,我们希望能够声明 const T varS& 类型是否已经 const/reference。