如何使用boost::expression-static在语义操作中引用可选子匹配
How to reference an optional submatch inside a semantic action with boost::xpressive static?
我有一个提升表达式sregex和语义操作,它等效于以下内容:
Rule = ('[' >> (s1=!(set=')',']','>')))[some_op(as<std::string>(s1))];
以前我在boost 1.43上使用这个,没有任何问题。我最近不得不升级到一个新的提升,现在我遇到了以下问题。在boost 1.48中,当子匹配与任何内容都不匹配时(因为它是可选的),当as
在空的s1
对象上执行时,语义动作会抛出bad_lexical_cast
异常。
我该如何解决这个问题,它以前起作用只是巧合吗?我应该用一些更好、更安全的方法来解决这个问题?或者这只是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++中通过引用进行修改的开销是多少
- 为什么 GCC 拒绝复制赋值操作中的常量引用
- 即使在单线程程序中,共享指针是否在引用计数中使用原子操作
- 如何编写对转发的引用元组进行操作的constexpr函数
- 仅在constexpr/编译时上下文中操作时,引用是否有用
- C++11:常量和引用类型上“auto”操作的标准引用
- 指针和引用-简单的CharArray操作程序
- 在C++中,执行去引用和获取索引0的操作是相同的
- C++通过引用将 3D 数组传递给第二个对象,无法操作
- 互操作程序集引用了 .NET 框架的哪些功能
- 免注册 COM 互操作.程序集 B 引用程序集 A
- 取消引用指针以操作地址的内容
- 在单个语句中将类类型分配给该类的取消引用指针时执行哪些操作
- 如何在编写自定义用户操作时引用内置操作
- 从C++COM dll生成的互操作程序集出现生成引用错误
- 将引用分配给引用是一个有效的操作
- C++通过引用传递嵌套的无序映射并对其进行操作
- 是否存在通过引用选择元素和通过指针操作选择元素都有效的情况
- 如何使用boost::expression-static在语义操作中引用可选子匹配
- 通过函数中的引用操作值的安全性