我有一个增强的xpressive sregex和语义操作,它等效于以下内容:

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

以前,我在boost 1.43上使用它时没有任何问题。我最近不得不升级到新的增强功能,现在遇到了以下问题。
在boost 1.48上,当子匹配项不匹配任何内容(因为它是可选的)时,在空bad_lexical_cast对象上执行as时,语义操作会引发s1异常。

我该如何解决这个问题,这是否只是以前的巧合,而我应该使用一些更安全的方法来做到这一点?或者这仅仅是例如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有更多了解的人都对此有所了解?

最佳答案

经过更多调查并与Xpressive的作者交谈后,我得出的结论是,这要么是lexical_cast行为的回归,要么是xpressive预期lexical_cast的行为方式的错误。

关于c++ - 如何在带有boost::xpressive static的语义 Action 中引用可选子匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9009431/

10-11 19:19