C++11 std::move()只是在施放?

C++11 std::move()只是在施放?,c++11,C++11,我已经阅读了std::move()的一些(pesudo)实现。所有这些都只是丢弃参数的引用,然后将其作为右值引用返回 它没有做更多的事情 然而,我很好奇: 1.它是否能做得更多。 2.标准是否明确说明了这一点,以便调用者能够意识到副作用 在C++编程语言第四版中,它声明了“移动(x)标记X)以破坏,以便移动(X)应小心使用。 这是否意味着标准会产生副作用,因此编译器可以进行某些优化 提前感谢。是的,std::move有点用词不当,因为它实际上不会移动任何东西。它用于表示对象可能被“移动” 它通过

我已经阅读了std::move()的一些(pesudo)实现。所有这些都只是丢弃参数的引用,然后将其作为右值引用返回

它没有做更多的事情

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

在C++编程语言第四版中,它声明了“移动(x)标记X)以破坏,以便移动(X)应小心使用。

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


提前感谢。

是的,
std::move
有点用词不当,因为它实际上不会移动任何东西。它用于表示对象可能被“移动”

它通过将对象强制转换为
T&
来实现这一点。表示返回值为静态(t)。(顺便说一句,这正是VS2017所做的)


我不知道标准对这件事的确切描述。

是的,这正是标准中所描述的。(这是我找到的最后一份草稿)

它在§23.2.5中说

template constexpr remove\u reference\u t&&move(t&&t)noexcept

返回:
static\u cast(t)

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

因此,如果我有void foo(C&&C);和foo(std::move(someC));someC在foo()返回后将被标记为销毁?提前谢谢!没有“标记毁灭”这样的东西。这个foo可能已经更改了对象someC(使其处于可破坏状态,例如使其变为空,就像在向量的情况下一样)。它将以与其他方式相同的方式被销毁(例如,在离开作用域时)。