Question

Je sais que cela semble stupide, mais regardez cet exemple simple (dir travail devrait avoir plus d'un point):

#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 est modifié avec it! (Coup de pouce 1,45) Quelles considérations pourraient conduire à une telle conception (directory_iterator est quelque chose comme ptr à puce)?

Je juste besoin d'enregistrer une copie de directory_iterator pour l'utiliser plus tard.

Était-ce utile?

La solution

Si vous jetez un oeil à la référence vous remarquerez qu'il est annoncé comme un boost::single_pass_traversal_tag.

Ceci est l'équivalent (dans la terminologie boost) du entrée Iterator dans la STL (pensez comme un itérateur délivrant des paquets à partir d'une connexion réseau, vous ne pouvez pas rewind).

Notez également (de cette même page):

i == j ne signifie pas que ++i == ++j.

À ce stade, on peut se demander pourquoi il peut être copié. La raison en est que les algorithmes de STL ont mis la norme en prenant leurs arguments par copie. Par conséquent, il ne serait pas utilisable avec des algorithmes de STL si elle ne pouvait pas être copié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top