5

これはばかげているように聞こえますが、この単純な例を見てください(作業ディレクトリには複数の項目が必要です)。

#define BOOST_FILESYSTEM_VERSION 3
#include <boost/filesystem.hpp>
#include <cassert>

int main()
{
    using namespace boost::filesystem;
    directory_iterator it("./");
    directory_iterator it_copy = it;
    ++it;
    assert(it_copy != it);
    return 0;
}

it_copyと一緒に変更されitます!(ブースト1.45)そのような設計につながる可能性のある考慮事項は何ですか(directory_iteratorスマートptrのようなものです)?

後で使用するには、のコピーを保存する必要がありますdirectory_iterator

4

1 に答える 1

6

参照を見ると、それがであると宣伝されていることがわかりますboost::single_pass_traversal_tag

これは、STLの入力イテレーターと同等です(ブースト用語では)(ネットワーク接続からパケットを配信するイテレーターと考えてください。巻き戻すことはできません)。

また、(この同じページから)注意してください:

i == jそれを意味するものではありません++i == ++j

この時点で、なぜそれをコピーできるのか不思議に思うかもしれません。その理由は、STLアルゴリズムが、コピーによって引数を取る基準を設定しているためです。したがって、コピーできなかった場合、STLアルゴリズムでは使用できません。

于 2011-03-21T17:38:24.663 に答える