неопределенное поведение где-то в 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;
}

Ответы на вопрос(1)

Ваш ответ на вопрос