我已经阅读了std :: move()的一些(pesudo)实现。所有这些都只是丢弃了参数的引用,然后将其作为右值引用返回。
它不会做更多的事情。
然而,我很好奇: 1.它是否不止于此。 2.标准是否明确说明,以便呼叫者应该知道副作用。
在“C ++编程语言”第4版中,它指出" move(x)标记x表示破坏,因此应小心使用move(x)"。
是否意味着标准会产生副作用,因此编译器可以进行某些优化?
提前致谢。
答案 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的函数中更改对象(例如移动构造函数,移动赋值运算符)