2

次と同等のブースト表現の sregex とセマンティック アクションがあります。

Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];

以前はこれをブースト 1.43 で問題なく使用していました。最近、新しいブーストにアップグレードする必要がありましたが、次の問題が発生しました。サブマッチが何も一致しない場合 (オプションであるため)、boost 1.48 では、空のオブジェクトで実行さbad_lexical_castれると、セマンティック アクションによって例外がスローされます。ass1

この問題を解決するにはどうすればよいですか。以前は機能していたのは単なる偶然であり、これを行うために使用すべきより安全な方法がありますか? それとも、これはたとえばlexical_cast、現在壊れているコードの変更xpressiveですか?

追加情報

regex_actions.hpp で以下を変更することで、実際の問題を一時的に解決することができました。

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;

    template<typename Value>
    T operator()(Value const &val) const
    {
        return lexical_cast<T>(val);
    }
};

の中へ:

template<typename T>
struct as
{
    BOOST_PROTO_CALLABLE()
    typedef T result_type;

    template<typename Value>
    T operator()(Value const &val) const
    {
        if(val.first==val.second)
        {
            return T();
        }
        else
        {
            return lexical_cast<T>(val);
        }
    }
};

これは、おそらくこれ自体を修正する必要があるものであると私に信じさせますxpressive. しかし、それが私の側で間違っていることではないことをまだ100%確信しているわけではありませんxpressive.

4

1 に答える 1

1

もう少し調査し、著者と話をした後、これは動作の回帰または動作が予想される方法のバグXpressiveのいずれかであるという結論に達しました。lexical_castxpressivelexical_cast

于 2012-01-26T06:25:40.780 に答える