Стандарт
27.9.1.8 Assign and swap [ifstream.assign]
basic_ifstream& operator=(basic_ifstream&& rhs);
Полагаю, вы смотрите не на тот код (нигде не гарантируется, что оператор базового класса istream::operator=(istream&&)
должен вызываться)?
Обновление : Вообще говоря, есть ли способ заставить ссылку lvalue на ссылку rvalue?
Да, это то, что 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;
, который делает то же самое, при условии, что конструктор перемещения не являетсяровселенным.