【发布时间】:2017-05-15 04:06:17
【问题描述】:
运行以下代码会导致崩溃。为什么?
#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,但我看不出问题到底出在哪里。
【问题讨论】:
-
您是否试图可靠地解析双精度数和整数?搜索stackoverflow.com/search?q=strict_real_policies
-
不,这只是我试图让事情尽可能简单的一个例子。这在其他地方仍然有用。谢谢!
-
这就是未定义行为的本质:您无法对其进行推理,因为结果未定义
标签: c++ boost boost-spirit boost-spirit-qi