为什么std :: move采用forward_reference而不是lvaue引用

时间:2017-07-04 09:02:08

标签: c++ c++11 move-semantics

只是为了确认我对std::move

的理解

std::move - 将T&转换为T&&,以便T's移动构造函数启动(如果存在,否则复制文件将发挥其作用,除非我们不是&# 39; t外部删除移动ctor / assignment)。

当我查看std::move的可能实现时,它就像

template<typename T>
typename remove_reference<T>::type&& move(T&& param)
{
using ReturnType =typename remove_reference<T>::type&&;
return static_cast<ReturnType>(param);
}

它使用remove_reference<T>的原因是因为在forward_reference T&&

上应用的参考折叠

我只是想知道为什么我们需要前瞻性参考,我们不能通过

来完成
template<typename T>
T&& moveInQuestion(T& p){
  return static_cast<T&&>(p);
}

struct someType{};
someType lvalref;
static_assert(is_same<decltype(moveInQuestion(lvalref)),decltype(std::move(lvalref))>::value,"");

static_assert没有失败。

我还认为std::move的价值类别是lvaluemoveInQuestion可能比std::move更好吗?

1 个答案:

答案 0 :(得分:8)

通常的例子是像

这样的通用代码
$merger=array_merge(array_column($arr2,'days'),array_column($arr1,'days'));
$merger=implode(',',$merger);

对于template<class T> T frob() { std::vector<T> x = /* ... */; return std::move(x[0]); } ,当moveT时,这会中断,因为在这种情况下bool是prvalue代理参考而不是左值。