как сделать копию boost :: filesystem :: directory_iterator? - PullRequest
5 голосов
/ 21 марта 2011

Я знаю, это звучит глупо, но посмотрите на этот простой пример (рабочий каталог должен иметь более одного элемента):

#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 - это что-то вроде smart ptr)?

Мне просто нужно сохранить копию directory_iterator, чтобы использовать ее позже.

1 Ответ

6 голосов
/ 21 марта 2011

Если вы посмотрите на ссылку , вы заметите, что она объявлена ​​как boost::single_pass_traversal_tag.

Это эквивалент (в терминологии буста) Итератора ввода в STL (его можно рассматривать как итератор, доставляющий пакеты из сетевого подключения, перемотка назад невозможна).

Также обратите внимание (с этой же страницы):

i == j не означает, что ++i == ++j.

В этот момент можно задаться вопросом, почему его можно скопировать. Причина в том, что алгоритмы STL установили норму, принимая свои аргументы за копию. Поэтому он не может быть использован с алгоритмами STL, если его невозможно скопировать.

...