c – std :: regex构造函数引发异常
发布时间:2020-12-16 03:24:03 所属栏目:百科 来源:网络整理
导读:请注意,这不是与StackOverflow有关 gcc的许多问题的重复,我使用的是Visual Studio 2013. 这个简单的正则表达式的构造throws std :: regex_error: bool caseInsensitive = true;char pattern[] = "bwordb";std::regex re(pattern,std::regex_constants::
请注意,这不是与StackOverflow有关
gcc的许多问题的重复,我使用的是Visual Studio 2013.
这个简单的正则表达式的构造throws std :: regex_error: bool caseInsensitive = true; char pattern[] = "bwordb"; 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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |