标题可能没有很好地表达。请评论正确的技术术语。
今天我注意到了以下情况。给定
const std::string in( "QWERT" );
std::string out;
boost::spirit::qi::parse( in.begin(), in.end(),
+boost::spirit::qi::char_, out );
boost::spirit::qi::parse( in.begin(), in.end(),
+boost::spirit::qi::char_[ boost::phoenix::ref( out ) =
boost::spirit::_1 ] );
boost::spirit::qi::parse( in.begin(), in.end(),
boost::spirit::as_string[ +boost::spirit::qi::char_ ]
[ boost::phoenix::ref( out ) = boost::spirit::_1 ] );
第一个parse
按预期将字符串QWERT
提取到out
。第二个只产生字符串T
。
我假设生成的凤凰函数在char_
(每个字符)的每个匹配上被调用,这意味着对out
的五个赋值,最后一个是T
。
这是预期的行为吗? (请指出升级文档中的相关部分。)
目前(我在语法中使用此作为规则)我通过第三个parse
中的表达式修复此问题,这看起来有点尴尬。
答案 0 :(得分:4)
这是C++ operator precedence引起的预期行为。你的第二个语法被评估为:
+ ( boost::spirit::qi::char_[ boost::phoenix::ref( out ) = boost::spirit::_1 ] )
你所期待的是:
(+boost::spirit::qi::char_)[ boost::phoenix::ref( out ) = boost::spirit::_1 ]
第二行实际上不起作用,因为(+ boost :: spirit :: qi :: char_)的类型为std::vector<char>
,所以你需要将该向量转换为字符串,就像你的第三个语法确实