对于以下代码:
#include<iostream>
#include<regex>
using namespace std;
int main(int argc, char *argv[])
{
regex reg("/");
string s = "Split/Values/Separated/By/Slashes";
sregex_token_iterator it{std::begin(s), std::end(s), reg, -1};
sregex_token_iterator end;
while(it != end)
{
cout << *it++ << endl;
}
return 0;
}应输出:
Split
Values
Separated
By
Slashes但它会输出以下内容:
Values
Separated
By
Slashes主要的代码可能是*it++有问题,如果我写的是cout << *it << endl;++it;,它就能正常工作。
当我将c++11正则表达式的展位改为boost-regex时,*it++也可以正常工作。
我已经检查了正则表达式的头部,我认为operator++(int)函数没有问题。
我的clang版本是
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix有没有人有这样的问题?
在clang中有没有bug?
发布于 2014-01-07 10:57:22
我发现这是一个libc++实现错误。
转到regex,插入以下两行
regex_token_iterator operator++(int)
{
regex_token_iterator __t(*this);
std::cout << "test---" << *__t << "---test" << endl;
++(*this);
std::cout << "test---" << *__t << "---test" << endl;
return __t;
}您会发现在++(* *__t )之后,++的值发生了变化!
进一步深入研究你会发现,
*__t实际上是通过返回内部value_type指针_result来实现的,而_result实际上指向&_position->prefix(),这是match_results的_prefix对象的地址,这个对象的地址从来没有改变,但是它的内容改变了。
https://stackoverflow.com/questions/20323648
复制相似问题