为什么 std::move 使用 std::remove_reference

why std::move uses std::remove_reference?

本文关键字:std remove reference move 为什么 使用      更新时间:2023-10-16

根据 http://en.cppreference.com/w/cpp/utility/move

std::move声明如下:

template <typename T>
std::remove_reference<T>::type&& move(T&& t);

我了解,当代码被模板化时,typename TT的推论会丢失有关引用的信息,因此:

template <typename T>
void someFunction(T&& value);

当像这样使用时:

int five=5;
someFunction(five);

然后

  • value属于int&类型
  • T int

const float value = 5.25;
someFunction(value);

然后

  • value属于const float&
  • T const float.

如果是这样,那么在移动声明中将返回的类型声明为: std::remove_reference<T>::type&&,因为 T 已经不是引用了。

此外,如果std::move将引用(实践中的 l 值引用)作为参数,那么实际上由于引用折叠而返回static_cast<T&&>(t) std::move将返回 l 值引用或 r 值引用,因此它的行为更像std::forward不移动。那么,什么是我不明白的技巧,使它正常工作?

您的示例不正确:

int five=5;
someFunction(five);

在这种情况下,T被推导出为int&,而不是int。第二个例子也是如此; T被推算为const int&

因此,只返回T&&意味着T&& &,这是由于引用折叠规则而T&的。

这就是需要std::remove_reference的原因,以确保类型上没有引用,以防止发生引用折叠。