std::move()只是类型转换吗?

3

我已经阅读了几个std::move()的(pesudo)实现。所有的实现都只是将参数的引用强制转换为右值引用并返回。

它没有做更多的事情。

然而,我很好奇: 1. 它是否做了更多的事情。 2. 标准是否明确说明了这一点,以便调用者应该意识到副作用。

在《C++程序设计语言》第四版中,它指出“move(x)标记x为待销毁对象,因此应谨慎使用move(x)”。

这是否意味着标准会产生副作用,从而编译器可以进行某些优化?

提前感谢。

2个回答

5
是的,这正如标准中描述的那样。在N4659(我找到的最后一份草案)中,§23.2.5中写道:

template <class T> constexpr remove_reference_t<T>&& move(T&& t) noexcept;

返回:static_cast<remove_reference_t<T>&&>(t)

它不会标记任何要销毁的内容,也不会改变对象,但是在接受右值的函数中(例如移动构造函数、移动赋值运算符)对象可能会被更改。

如果我有void foo(C&& c);和foo(std::move(someC));,那么在foo()返回后,someC将被标记为销毁吗?谢谢! - Hei
不存在“标记为销毁”的概念。这个foo可能改变了对象someC(使其处于可销毁状态,例如在vector的情况下使其为空)。它将以与否则相同的方式被销毁(例如当离开作用域时)。 - RiaD

1

是的,std::move 有点名不副实,因为它实际上并没有移动任何东西。它用于指示一个对象可以被“移动”。

它通过将对象转换为 T&& 来实现这一点。cppreference表明返回值为 static_cast<typename std::remove_reference<T>::type&&>(t)。(顺便说一下,这正是VS2017所做的)

我不知道标准在这个问题上确切的说法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接