2

以下を使用します。

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

&& が呼び出されているのに&&の代わりにifstream::operator=(const ifstream&が呼び出されるのはなぜですか?)ifstream::operator=(ifstream)std::move()

更新:一般的に言えば、左辺値参照を右辺値参照に強制する方法はありますか?

4

2 に答える 2

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)
于 2011-11-21T15:20:30.690 に答える
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 が nothrow である場合、同じことを行います。

于 2011-11-21T10:23:02.777 に答える