Mingw32-w64 GCC 4.9.2 正则表达式错误,或者我不知道C++

Mingw32-w64 GCC 4.9.2 regex bug, or me not knowing C++?

本文关键字:或者 我不知道 C++ 错误 正则表达式 GCC Mingw32-w64      更新时间:2023-10-16
#include <iostream>
#include <vector>
#include <regex>
using namespace std;
int main()
{
    char rs[] = R"((s+)|([rn][rn]?))"; /* split on whitespace or newline */
    regex r(rs); // this regex declared like a local variable
    string s("foo  bar t baznqux quux corge");
/* Part 1 */
    sregex_token_iterator
            first {begin(s), end(s), r, -1},
            last;
    vector<string> tokens1 {first, last};
    for(auto i : tokens1) {
        cout << i << ", ";
    }
/* Part 2 */
    cout << endl << endl << "inline:";
    //string regexstring(rs); // <<< uncomment for different behavior
    /* here, the regex is created inline */
    sregex_token_iterator
            first2 {begin(s), end(s), regex(rs), -1},
            last2;
    vector<string> tokens2 {first2, last2};
    for(auto i : tokens2) {
        cout << i << ", ";
    }
}

这已经让我发疯了一段时间。这个程序在我的机器上轰炸,从tokens2打印令牌时它会卡在某个循环中,直到它出现段错误。如果取消注释指示的行,程序将运行。但是,只有tokens1包含正确拆分的令牌,我看不出区别在哪里。

这是一个简化的最小示例,在具有WinXP SP3,Code::Blocks和从Sourceforge(今天)Mingw64 GCC 4.9.2 for win32新下载的计算机上重现了该行为。我在GCC 4.9.2的TDM-GCC-W32版本中得到了相同的行为。

显然,这些一定是 2 个错误,对吧?还是我真的不明白C++?

regex_token_iterator 不像

2 部分中那样使用临时 regex 对象进行调用,因为它不存储regex实例的副本。第 2 部分会导致未定义的行为,因为调用会导致迭代器由于regex实例在表达式末尾被销毁而失效。

C++14 通过添加 delete d 右值重载来解决此问题,这会阻止第二个示例进行编译。

相关文章: