【发布时间】:2014-02-25 19:06:15
【问题描述】:
精神解析器不应该与auto一起使用吗?
一个简单的解析器在传递给qi::parse() inline 时可以正常工作,但如果通过auto 变量传递,则会因段错误而崩溃:
#include <cstdio>
#include <string>
#include <boost/spirit/include/qi.hpp>
using namespace std;
namespace qi = boost::spirit::qi;
int main()
{
string line = "[z]";
auto bracketed_z = '[' >> +qi::char_('z') >> ']';
auto p = line.cbegin();
printf("%d", qi::parse(p, line.cend(), '[' >> +qi::char_('z') >> ']')); // Works
p = line.cbegin();
printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Crashes
}
使用 g++-4.8 和 VC13 重现。
更新:修复了原始代码中的一个错误(p 在第二次调用 parse() 之前没有重新初始化)。
【问题讨论】:
-
任何 c++ 解析器如何处理
auto?解析器旨在读取在运行时确定的特定类型,auto类型在编译时解析。所以恕我直言,除非auto导致boost::variant或boost::any这是不可能的。 -
请注意,第一个迭代器是通过引用 (IIRC) 传递的。也就是说,
p在第一次调用qi::parse之后已经改变了。 -
谢谢你,@dyp。修复了错误。
-
@πάνταῥεῖ:在这个简单的例子中,一切都应该是编译时的。
标签: c++ parsing boost-spirit-qi