以下内容:
#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()
?
更新:一般来说,有没有办法强制左值引用左值参考?
答案 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不是,那么也会这样做。