2

このコードを見てください:

#include <iostream>
#include <algorithm>
#include <fstream>
#include <iterator>

using namespace std;

int main()
{
ifstream text("text.txt");

istreambuf_iterator<char> iis(text);
string longest_phrase, _longest;

while (iis != istreambuf_iterator<char>()) {
    if ( *iis != '.' ) {
        _longest.push_back(*iis);
        ++iis;
        continue;
    }
    if ( _longest.size() > longest_phrase.size() )
        longest_phrase = move(_longest); //I want to move the data of _longest to longest_phrase. Just move! Not to copy!
    cout << _longest.empty(); //why _longest is not empty??
            //_longest.clear();
    ++iis;
}
text.close();
longest_phrase.push_back('.');
cout << "longest phrase is " << longest_phrase;
return 0;
}

このコードは、ファイル内で最も長いフレーズを検索します。では、なぜ左辺値から右辺値への変換が機能しないのでしょうか?

編集:それがうまくいかなかったと思った理由です:

class Vector {
public:
    Vector(vector<int> &&v): vec( move(v) ) {}
    vector<int> vec;
};

int main()
{
    vector<int> ints(50, 44);
    Vector obj( move(ints) );
    cout << ints.empty();
    return 0;
}

迅速で役立つ回答をありがとうございました。

4

3 に答える 3

9

標準ライブラリの移動元オブジェクトの状態について、それが正当な状態であるという事実を除いて、具体的な仮定を行うべきではありません (移動代入演算子または移動コンストラクターの事後条件がさらに指定されている場合を除きます)。

C++11 標準のパラグラフ 17.6.5.15 によると:

C++ 標準ライブラリで定義されている型のオブジェクトは、(12.8) から移動できます。移動操作は、明示的に指定することも、暗黙的に生成することもできます。特に指定がない限り、そのような移動元オブジェクトは、有効であるが指定されていない状態に置かれます。

さらに、クラス テンプレートの move-assignment 演算子に関する段落 21.4.2/21-23 では、moved-from 文字列を呼び出すと が返されるbasic_stringような状態のままにするかどうかについては何も指定されていません。empty()true

この場合、呼び出されるオブジェクトempty()の状態に関する前提条件がないため、呼び出しは正当です。string一方、戻り値がどうなるかを推測することはできません。

于 2013-05-10T09:43:43.980 に答える