c – std :: regex构造函数引发异常

请注意,这不是与StackOverflow有关 gcc的许多问题的重复,我使用的是Visual Studio 2013.

这个简单的正则表达式的构造throws std :: regex_error:

bool caseInsensitive = true;
char pattern[] = "\\bword\\b";
std::regex re(pattern,std::regex_constants::ECMAScript | (caseInsensitive ? std::regex_constants::icase : 0));

由异常对象返回的实际错误不一致.通常它是不匹配的parethesis或大括号.为什么?

解决方法

问题出现是因为std :: regex可用的多个构造函数.跟踪到构造函数显示它使用一个我不打算!

我想用这个:

explicit basic_regex(_In_z_ const _Elem *_Ptr,flag_type _Flags = regex_constants::ECMAScript)

但是我得到了这个:

basic_regex(_In_reads_(_Count) const _Elem *_Ptr,size_t _Count,flag_type _Flags = regex_constants::ECMAScript)

标志中的三进制表达式导致类型更改为int,这在构造函数签名中不再匹配flag_type.由于它在size_t上匹配,所以调用该构造函数.标志被错误地解释为字符串的大小,导致访问字符串结尾处的内存时出现未定义的行为.

该问题不是Visual Studio专用的.我能够在gcc:http://ideone.com/5DjYiz中复制它

它可以固定两种方式.首先是一个明确的论点:

std::regex re(pattern,static_cast<std::regex::flag_type>(std::regex_constants::ECMAScript | (caseInsensitive ? std::regex_constants::icase : 0)));

二是避免三元表达式中的整数常数:

std::regex re(pattern,caseInsensitive ? std::regex_constants::ECMAScript | std::regex_constants::icase : std::regex_constants::ECMAScript);

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...