gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:20:10 24 4
gpt4 key购买 nike

spirit 解析器不是要与 auto 一起使用吗?

一个简单的解析器在传递给 qi::parse() 内联时工作正常,但如果通过 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() 之前未重新初始化)。

最佳答案

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 X3不会有这个限制。

关于c++ - 将解析器分配给自动变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22023779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com