我已经阅读了几个std::move()的(pesudo)实现。所有的实现都只是将参数的引用强制转换为右值引用并返回。
它没有做更多的事情。
然而,我很好奇: 1. 它是否做了更多的事情。 2. 标准是否明确说明了这一点,以便调用者应该意识到副作用。
在《C++程序设计语言》第四版中,它指出“move(x)标记x为待销毁对象,因此应谨慎使用move(x)”。
这是否意味着标准会产生副作用,从而编译器可以进行某些优化?
提前感谢。
我已经阅读了几个std::move()的(pesudo)实现。所有的实现都只是将参数的引用强制转换为右值引用并返回。
它没有做更多的事情。
然而,我很好奇: 1. 它是否做了更多的事情。 2. 标准是否明确说明了这一点,以便调用者应该意识到副作用。
在《C++程序设计语言》第四版中,它指出“move(x)标记x为待销毁对象,因此应谨慎使用move(x)”。
这是否意味着标准会产生副作用,从而编译器可以进行某些优化?
提前感谢。
它不会标记任何要销毁的内容,也不会改变对象,但是在接受右值的函数中(例如移动构造函数、移动赋值运算符)对象可能会被更改。
template <class T> constexpr remove_reference_t<T>&& move(T&& t) noexcept;
返回:
static_cast<remove_reference_t<T>&&>(t)
是的,std::move
有点名不副实,因为它实际上并没有移动任何东西。它用于指示一个对象可以被“移动”。
它通过将对象转换为 T&&
来实现这一点。cppreference表明返回值为 static_cast<typename std::remove_reference<T>::type&&>(t)
。(顺便说一下,这正是VS2017所做的)
我不知道标准在这个问题上确切的说法。