的实现std::move
基本上是这样的:
template<typename T>
typename std::remove_reference<T>::type&&
move(T&& t)
{
return static_cast<typename std::remove_reference<T>::type&&>(t);
}
请注意,参数ofstd::move
是一个通用引用(也称为转发引用,但我们这里不转发)。也就是说,您可以std::move
同时使用左值和右值:
std::string a, b, c;
// ...
foo(std::move(a)); // fine, a is an lvalue
foo(std::move(b + c)); // nonsense, b + c is already an rvalue
但是既然整个点std::move
是转换为右值,为什么我们甚至允许右值std::move
呢?std::move
如果只接受左值不是更有意义吗?
template<typename T>
T&&
move(T& t)
{
return static_cast<T&&>(t);
}
那么无意义的表达式std::move(b + c)
会导致编译时错误。
对于初学者来说,上面的实现std::move
也更容易理解,因为代码完全按照它的样子做:它接受一个左值并返回一个右值。您不必了解通用引用、引用折叠和元函数。
那么为什么std::move
设计为同时采用左值和右值呢?