只是为了确认我对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
的价值类别是lvalue
,moveInQuestion
可能比std::move
更好吗?
答案 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]);
}
,当move
为T
时,这会中断,因为在这种情况下bool
是prvalue代理参考而不是左值。