在std :: move存在时移动未使用的语义

时间:2011-11-21 10:16:00

标签: c++ c++11 rvalue-reference noncopyable

以下内容:

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ifstream f;
    ifstream g;
    f = std::move(g);
}

为什么要调用ifstream::operator=(const ifstream &amp; )而不是ifstream::operator=(ifstream &amp;&amp; )虽然叫std::move()

更新:一般来说,有没有办法强制左值引用左值参考?

2 个答案:

答案 0 :(得分:5)

您有什么证据表明ifstream::operator=(const ifstream&)正在被召唤?您是否收到编译错误,说您正在调用此私有或已删除的成员?

如果您的代码正在调用ifstream::operator=(const ifstream&),并且您的实现声称是C ++ 11,那么这是您的C ++ std :: lib或编译器中的错误。编译代码时,ifstream::operator=(ifstream&&)被调用。这是设计的。

为了确定,我在ifstream::operator=(ifstream&&)的实现中粘贴了一个print语句。当我打开你的程序时打印出来:

basic_ifstream<_CharT, _Traits>::operator=(basic_ifstream&& __rhs)

答案 1 :(得分:1)

标准

 27.9.1.8 Assign and swap [ifstream.assign]

       basic_ifstream& operator=(basic_ifstream&& rhs);

我假设您正在查看错误的代码(无论如何都保证基类操作符istream::operator=(istream&&) 必须被调用)?


  

更新:一般来说,有没有办法强制左值引用左值参考?

是的,这是std::move的作用:

template <class T> typename remove_reference<T>::type&& move(T&& t) noexcept;

还有

template <class T> typename conditional<
  !is_nothrow_move_constructible<T>::value && is_copy_constructible<T>::value,
  const T&, T&&>::type move_if_noexcept(T& x) noexcept;
如果moveconstructor不是,那么

也会这样做。