2011-03-21 16 views
5

Sé que esto suena estúpido, pero un vistazo a este sencillo ejemplo (dir de trabajo debe tener más de un elemento):cómo hacer una copia de boost :: filesystem :: directory_iterator?

#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 se modifica junto con it! (impulso 1.45) ¿Qué consideraciones podrían llevar a dicho diseño (directory_iterator es algo así como ptr inteligente)?

Solo necesito guardar una copia de directory_iterator para usarla más tarde.

Respuesta

6

Si echa un vistazo al reference notará que se anuncia que es un boost::single_pass_traversal_tag.

Este es el equivalente (en la terminología de boost) del Input Iterator en el STL (piense en ello como un iterador que entrega paquetes desde una conexión de red, no puede rebobinar).

También tenga en cuenta (a partir de esta misma página):

i == j no implica que ++i == ++j.

En este punto, uno puede preguntarse por qué se puede copiar. La razón es que los algoritmos STL han establecido la norma tomando sus argumentos por copia. Por lo tanto, no sería utilizable con algoritmos STL si no se pudiera copiar.

Cuestiones relacionadas