Повысить совместимость атрибутов спиртовой строки

Название может быть не очень хорошо выражено. Пожалуйста, прокомментируйте правильный технический термин.

Сегодня я заметил следующее. Дано

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>поэтому вам нужно преобразовать этот вектор в строку, как это делает ваша третья грамматика.

Другие вопросы по тегам