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

时间:2016-02-08 09:46:01

标签: c++ c++11 c++14 move

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

std::move声明如下:

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

就我的理解而言,当代码被模板化时,Ttypename T的推断会丢失有关引用的信息,因此遵循:

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

使用时如:

int five=5;
someFunction(five);

然后

  • value的类型为int&
  • Tint

const float value = 5.25;
someFunction(value);

然后

  • value的类型为const float&
  • Tconst float

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

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

1 个答案:

答案 0 :(得分:7)

您的示例不正确:

int five=5;
someFunction(five);

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

因此,仅返回T&&意味着T&& &,由于参考折叠规则而导致T&

这就是为什么std::remove_reference是必需的,以确保没有类型的引用来防止引用崩溃。