将分析器分配给自动variables

灵魂分析器是不是要用于auto

一个简单的parsing器在传递给内联函数qi::parse()时可以正常工作,但如果通过一个autovariables传递,则会崩溃。

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

精灵parsing器并非devise用于Spirit V2中的auto

这是因为底层Protoexpression式模板持有临时对象的引用。

您可以使用

  • qi::copy() (在boost_1_55_0之后存在于主干中,此时不在任何发布版本中)
  • boost::proto::deep_copy
  • 或BOOST_SPIRIT_AUTO(首先在这里创造)

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

  • 提升精神V2 qi与优化级别相关的bug

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

Boost.Spirit使用expression式模板,不适用于auto 。 解决方法是使用boost::proto::deep_copy

 auto bracketed_z = proto::deep_copy('[' >> +qi::char_('z') >> ']'); 
Interesting Posts