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

Daw*_*dPi 0 c++ move c++11 c++14

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

std::move 声明如下:

template <typename T>
std::remove_reference<T>::type&& move(T&& t);
Run Code Online (Sandbox Code Playgroud)

至于我的理解去,当代码为模板,在扣除Ttypename T失去约的参考信息,所以以下内容:

template <typename T>
void someFunction(T&& value);
Run Code Online (Sandbox Code Playgroud)

使用时如:

int five=5;
someFunction(five);
Run Code Online (Sandbox Code Playgroud)

然后

  • value 是类型的 int&
  • Tint

要么

const float value = 5.25;
someFunction(value);
Run Code Online (Sandbox Code Playgroud)

然后

  • value 是类型的 const float&
  • Tconst float.

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

此外,如果std::move采用作为参数的引用(实际上1-值参考),然后返回static_cast<T&&>(t)std::move实际上由于参照塌缩将返回-1-参考值或R值的参考,所以它会表现得更像std::forward不移动.那么什么是诀窍,让它运作正常,我不明白?

Tar*_*ama 7

您的示例不正确:

int five=5;
someFunction(five);
Run Code Online (Sandbox Code Playgroud)

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

因此,返回只是T&&意味着T&& &,这是T&由于参考折叠规则.

这就是为什么std::remove_reference需要,以确保没有类型的参考,以防止参考崩溃发生.