3

タイトルはうまく表現できないかもしれません。正しい専門用語についてコメントしてください。

今日、私は次のことに気付きました。与えられた

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抽出します。2 番目は string のみを生成します。QWERToutT

生成されたフェニックス関数は、char_(各文字)の各一致で呼び出されると仮定します。これは、 への 5 つの割り当てを意味しout、最後のT.

これは予想される動作ですか?(boost ドキュメントの関連セクションを教えてください。)

現在(私はこれを文法のルールとして使用しています)、3番目の式でこれを修正しましたがparse、これは少しぎこちなく見えます。

4

1 に答える 1

4

これは、 C++ 演算子の優先順位による予期される動作です。2 番目の文法は次のように評価されています。

+ ( 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_) は typestd::vector<char>であるため、その 2 行目は実際には機能しません。したがって、3 番目の文法と同様に、そのベクトルを文字列に変換する必要があります。

于 2013-05-24T19:51:18.590 に答える