为什么除了在 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 var
和 S&
类型是否已经 const/reference。
考虑到右值和左值不是对象的特征而是表达式的特征。
为什么 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 var
和 S&
类型是否已经 const/reference。