Выполнение следующего кода приводит к сбою. Зачем?boost :: spirit :: multi_pass crash с предикатом и альтернативой
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_multi_pass.hpp>
using namespace boost::spirit;
typedef multi_pass<
std::string::const_iterator,
iterator_policies::default_policy<
iterator_policies::first_owner,
iterator_policies::no_check,
iterator_policies::buffering_input_iterator,
iterator_policies::split_std_deque>>
string_mp_iterator;
int main() {
std::string input = "234";
string_mp_iterator input_begin(input.begin()),
input_end((string_mp_iterator()));
qi::rule<string_mp_iterator, boost::variant<int, double>()> r =
&qi::lit('1') >> qi::int_ | qi::double_;
qi::parse(input_begin, input_end, r);
return 0;
}
Чтобы воспроизвести аварии, я, кажется, нужно иметь как предикат и последующую альтернативу, чтобы с помощью multi_pass
итератора, а для ввода не удовлетворяет предикат.
У меня такое ощущение, что я как-то неправильно использовал multi_pass
, но я не понимаю, в чем проблема.
Вы пытаетесь разобрать удвоение против ints надежно? Поиск https://stackoverflow.com/search?q=strict_real_policies – sehe
Нет, это просто пример, где я стараюсь, чтобы вещи были максимально простыми. Тем не менее это будет полезно в других местах. Благодаря! –
Это характер неопределенного поведения: вы не можете рассуждать об этом, потому что результаты не определены – sehe