Повысить совместимость атрибутов спиртовой строки
Название может быть не очень хорошо выражено. Пожалуйста, прокомментируйте правильный технический термин.
Сегодня я заметил следующее. Дано
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
, который выглядит немного неловко.
1 ответ
Это ожидаемое поведение из-за приоритета оператора C++. Ваша вторая грамматика оценивается как:
+ ( 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>
поэтому вам нужно преобразовать этот вектор в строку, как это делает ваша третья грамматика.