auto concatenación de resultados de análisis en vectores

He escrito algunas reglas para analizar flotadores en dos std :: vector's de flotadores, que a su vez se almacenan en una estructura:

Entrada de datos:

#
# object name01
#

v  -1.5701 33.8087 0.3592
v  -24.0119 0.0050 21.7439
# a comment

vn 0.0000 0.5346 0.8451
vn 0.8331 0.5531 -0.0000
# another comment

Struct:

struct ObjParseData
{
    ObjParseData() : verts(), norms() {}

    std::vector<float> verts;
    std::vector<float> norms;
};

Y el código de análisis relevante:

struct objGram : qi::grammar<std::string::const_iterator, ObjParseData(), iso8859::space_type>
    {
        objGram() : objGram::base_type(start)
        {
            vertex  = 'v' >> qi::double_ >> qi::double_ >> qi::double_;
            normal  = "vn" >> qi::double_ >> qi::double_ >> qi::double_;
            comment = '#' >> qi::skip(qi::blank)[ *(qi::print) ];
            vertexList = *(vertex | comment);
            normalList = *(normal | comment);
            start = vertexList >> normalList;
        }

        qi::rule<std::string::const_iterator, ObjParseData(), iso8859::space_type> start;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertexList;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> normalList;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;
        qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> normal;
        qi::rule<std::string::const_iterator, iso8859::space_type> comment;
    } objGrammar;


    ObjParseData resultData;

    std::string::const_iterator f = data.cbegin();
    bool res = qi::phrase_parse( f, data.cend(), objGrammar, iso8859::space, resultData );

Y esto funciona. Analiza todos los flotadores precedidos por 'v' en el vector verts de la estructura y todos los flotadores precedidos por "vn" en normas. Lo cual es genial, pero realmente no sé por qué funciona esto.

Ahora bien, si entiendo esto correctamente, una regla definida a continuación pone todos sus resultados en un std :: vector de flotadores.

qi::rule<std::string::const_iterator, std::vector<float>(), iso8859::space_type> vertex;

Entonces, mirando el código de análisis que se muestra arriba y sabiendo que una regla como vértice se analiza en un std :: vector de flotadores, aparentemente una regla como vertexList (la que se muestra arriba) concatena los resultados del vértice en un std :: vector de flotadores ? Entonces, viendo este comportamiento, pensarías que podrías escribir esas dos reglas (vértice y vertexList) como una, pero desafortunadamente esto no funciona:

vertex  = *('v' >> qi::double_ >> qi::double_ >> qi::double_) | comment;
normal  = *("vn" >> qi::double_ >> qi::double_ >> qi::double_) | comment;
comment = '#' >> qi::skip(qi::blank)[ *(qi::print) ];
start = vertex >> normal;

El código se compila y qi :: phrase_parse devuelve un análisis exitoso, pero el archivo std :: vector en la estructura ya no está lleno ... ¿Qué me estoy perdiendo aquí?

Respuestas a la pregunta(1)

Su respuesta a la pregunta