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