std :: move()只是投射?

时间:2017-11-19 06:24:16

标签: c++11

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

它不会做更多的事情。

然而,我很好奇: 1.它是否不止于此。 2.标准是否明确说明,以便呼叫者应该知道副作用。

在“C ++编程语言”第4版中,它指出" move(x)标记x表示破坏,因此应小心使用move(x)"。

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

通过将对象转换为T&&来实现此目的。 cppreference表示返回值为static_cast<typename std::remove_reference<T>::type&&>(t)。 (顺便说一句,这正是VS2017的作用)

我不确切地知道标准在这件事上说了什么。

答案 1 :(得分:1)

是的,这与标准中描述的完全一致。在N4659(这是我找到的最后一个草稿)

在§23.2.5中说明

  

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

     

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

它没有标记任何破坏,并且它不会更改对象,但是可以在接受rvalue的函数中更改对象(例如移动构造函数,移动赋值运算符)