Asignar analizadores a variables automáticas

¿Los analizadores espirituales no están destinados a ser usados ​​con auto ?

Un analizador simple funciona bien cuando se pasa a qi::parse() línea, pero se bloquea con segfault si se pasa a través de una variable auto :

 #include  #include  #include  using namespace std; namespace qi = boost::spirit::qi; int main() { string line = "[z]"; auto bracketed_z = '[' >> +qi::char_('z') >> ']'; auto p = line.cbegin(); printf("%d", qi::parse(p, line.cend(), '[' >> +qi::char_('z') >> ']')); // Works p = line.cbegin(); printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Crashes } 

Reproduce con g ++ – 4.8 y VC13.

Actualización: se corrigió un error en el código original ( p no se reinicializó antes de la segunda llamada a parse() ).

Los Spirit Parsers no están diseñados para usarse con auto en Spirit V2.

Esto se debe a que las plantillas de expresión Proto subyacentes contienen referencias a los temporales.

Puedes usar

  • qi::copy() (existente en el trunk después de boost_1_55_0, no en ninguna versión lanzada en este momento)
  • boost::proto::deep_copy
  • o BOOST_SPIRIT_AUTO (primero acuñado aquí )

He escrito sobre estas cosas más a menudo en SO: https://stackoverflow.com/search?q=user%3A85371+deep_copy , específicamente, esto:

  • boost spirit V2 qi error asociado con el nivel de optimización

Boost Spirit X3 no tendrá esta limitación.

Boost.Spirit utiliza plantillas de expresión y no funciona con auto . Una solución alternativa es usar boost::proto::deep_copy :

 auto bracketed_z = proto::deep_copy('[' >> +qi::char_('z') >> ']');