确认一下我对 std::move
的理解是否正确:
std::move
- 将 T&
转换为 T&&
,以便触发 T
的移动构造函数(如果存在的话,否则复制构造函数将发挥其作用,除非我们外部删除了移动构造函数/赋值)。
当我查看可能的 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>
的原因是由于对前向引用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
更好?