regex_token_iterator *it++ bug?

regex_token_iterator *it++ bug?

本文关键字:bug it++ iterator token regex      更新时间:2023-10-16

用于以下代码:

#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正则表达式时,*it++也可以正常工作。

我已经检查了regex的头部,我认为operator++(int)函数没有问题。

我的叮当版本是

Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0
Thread model: posix

有人有这样的问题吗?

叮当里有虫子吗?

我发现这是一个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的值在++(*this)之后发生了变化!

进一步挖掘你会发现,

*__t实际上是通过返回内部value_type指针_result来实现的,而_result置->prefix(),这是match_results'_前缀对象的地址,该对象的地址从未更改,但其内容发生了更改。