comportamento indefinido em algum lugar no impulso :: espírito :: qi :: frase_parar
Estou aprendendo a usar a biblioteca boost :: spirit. Eu peguei esse exemplohttp://www.boost.org/doc/libs/1_56_0/libs/spirit/example/qi/num_list1.cpp e compilou no meu computador - funciona bem.
No entanto, se eu modificá-lo um pouco - se eu inicializar o próprio analisador
auto parser = qi::double_ >> *(',' >> qi::double_);
em algum lugar como variável global e passá-lo para o expression_parse, tudo fica louco. Aqui está o código completo modificado (apenas 1 linha é modificada e 1 adicionada) -http://pastebin.com/5rWS3pMt
Se eu executar o código original e passar "3.14, 3.15" para stdin, ele diz que a Análise foi bem-sucedida, mas com a minha versão modificada, ela falha. Eu tentei muitas modificações do mesmo tipo - atribuindo o analisador à variável global - em algumas variantes em alguns compiladores que ele segmenta.
Não entendo o porquê e como é que é. Aqui está outra versão mais simples que imprime true e, em seguida, segfaults no clang ++ e apenas segfaults no g ++
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
const auto doubles_parser_global = qi::double_ >> *(',' >> qi::double_);
int main() {
const auto doubles_parser_local = qi::double_ >> *(',' >> qi::double_);
const std::string nums {"3.14, 3.15, 3.1415926"};
std::cout << std::boolalpha;
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_local, ascii::space
)
<< std::endl; // works fine
std::cout
<< qi::phrase_parse(
nums.cbegin(), nums.cend(), doubles_parser_global, ascii::space
) // this segfaults
<< std::endl;
}