我有一个提升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
有更多了解的人都对此有所了解吗?
答案 0 :(得分:1)
在进一步调查并与Xpressive
的作者交谈之后,我得出结论:这可能是lexical_cast
行为的回归,也可能是xpressive
行为中的错误预期lexical_cast
表现出来。