Mingw32-w64 GCC 4.9.2 正则表达式错误,或者我不知道C++
Mingw32-w64 GCC 4.9.2 regex bug, or me not knowing C++?
#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 右值重载来解决此问题,这会阻止第二个示例进行编译。
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- 我不知道这条线是做什么的
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 我不知道导致错误的原因 (C3074)
- 我不知道为什么这段代码会让核心被转储?
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 我不知道如何使用代码块win32 gui
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- if-else 语句仅按特定顺序工作,我不知道为什么
- DirectX 11 引擎在第三次代码改进后没有突然运行,我不知道为什么
- 程序输入名称和高度并显示它。我不知道如何显示列表中最高人的姓名和身高
- 函数抛出seg错误,我不知道为什么
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- 我已经做了一个程序来使用队列链C++表显示学生姓名和身高,现在我想以我不知道如何显示的顺序显示它
- 我看过Stellarium代码,我不知道它从哪里开始
- C++ 我不知道此代码中的输出过程(父类子级)
- 这是系统资源吗?(或者我怎么知道我是否需要删除指针) - 在 C++ 中使用 C
- Mingw32-w64 GCC 4.9.2 正则表达式错误,或者我不知道C++