其他分享
首页 > 其他分享> > c – 将解析器分配给自动变量

c – 将解析器分配给自动变量

作者:互联网

灵魂解析器不打算与auto一起使用吗?

一个简单的解析器在传递给qi :: parse()内联时工作正常,但如果通过auto变量传递则崩溃为segfault:

#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()之前未重新初始化).

解决方法:

Spirit Parsers不适用于Spirit V2中的auto.

这是因为底层的Proto表达式模板包含对临时表的引用.

您可以使用

> qi :: copy()(在boost_1_55_0之后存在于trunk中,此时不在任何已发布的版本中)
> boost :: proto :: deep_copy
>或BOOST_SPIRIT_AUTO(第一次创造here)

我在SO:https://stackoverflow.com/search?q=user%3A85371+deep_copy上经常写这些东西,具体来说,这个:

> boost spirit V2 qi bug associated with optimization level

提升精神X3不会有这个限制.

标签:boost-spirit-qi,c,parsing
来源: https://codeday.me/bug/20190916/1807823.html