2

我有一个提升 xpressive 正则表达式和语义操作,相当于以下内容:

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

以前我在 boost 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_cast方式的错误。xpressivelexical_cast

于 2012-01-26T06:25:40.780 回答