标题可能表达得不是很好。请评论正确的技术术语。
今天我注意到以下几点。给定
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
。
我假设生成的 phoenix 函数在 char_
的每次匹配(即每个字符)上被调用,这意味着对 out
的五个赋值,最后一个是 T
。
这是预期的行为吗? (请指出 boost 文档中的相关部分。)
目前(我在语法中使用它作为规则)我通过第三个 parse
中的表达式修复了这个问题,这看起来有点尴尬。
最佳答案
这是由于 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>
,因此您需要将该 vector 转换为字符串,就像您的第三个语法一样。
关于c++ - 提升灵弦属性兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742475/