将分析器分配给自动variables
灵魂分析器是不是要用于auto
?
一个简单的parsing器在传递给内联函数qi::parse()
时可以正常工作,但如果通过一个auto
variables传递,则会崩溃。
#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') >> ']');