#include <iostream>
#include <vector>
#include <regex>
using namespace std;
int main()
{
char rs[] = R"((\s+)|([\r\n][\r\n]?))"; /* split on whitespace or newline */
regex r(rs); // this regex declared like a local variable
string s("foo bar \t baz\nqux 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 ++?
答案 0 :(得分:5)
regex_token_iterator
不应像使用第2部分那样使用临时regex
对象进行调用,因为它不会存储regex
的副本实例。 第2部分导致未定义的行为,因为调用导致迭代器由于regex
实例在表达式结尾处被销毁而已经失效。
C++14 fixes this problem添加了delete
d rvalue重载,这些重载会阻止您的第二个示例进行编译。