неопределенное поведение где-то в boost :: spirit :: qi :: фраза_парс
Я учусь использовать библиотеку boost :: spirit. Я взял этот примерhttp://www.boost.org/doc/libs/1_56_0/libs/spirit/example/qi/num_list1.cpp и скомпилировал его на моем компьютере - он работает нормально.
Однако, если я немного изменю это - если я инициализирую сам синтаксический анализатор
auto parser = qi::double_ >> *(',' >> qi::double_);
где-то как глобальная переменная и передать ее в фразу_парс, все сходит с ума Вот полный измененный код (только 1 строка изменена и 1 добавлена) -http://pastebin.com/5rWS3pMt
Если я запускаю исходный код и передаю «3.14, 3.15» в stdin, он говорит, что синтаксический анализ выполнен успешно, но с моей модифицированной версией он не работает Я перепробовал множество модификаций одного типа - присвоение парсера глобальной переменной - в некоторых вариантах на некоторых компиляторах это происходит с ошибками.
Я не понимаю, почему и как это так. Вот еще одна, более простая версия, которая печатает true и затем segfaults на clang ++ и просто segfaults на 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;
}