regex_token_iterator*it ++ bug?

use*_*477 7 c++ regex c++11

用于以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

应该输出:

Split
Values
Separated
By
Slashes
Run Code Online (Sandbox Code Playgroud)

但它输出这个:

Values
Separated
By

Slashes
Run Code Online (Sandbox Code Playgroud)

主要代码可能是问题*it++,如果我写cout << *it << endl;++it;,它的工作正常.

当我将stand c ++ 11 regex更改为boost-regex时,*it++也正常工作.

我检查了正则表达式的头部,我认为该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
Run Code Online (Sandbox Code Playgroud)

有人有这样的问题吗?

clang中有错误吗?

use*_*498 3

我发现这是一个 libc++ 实现错误。

转到正则表达式,插入以下两行

    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;
    }
Run Code Online (Sandbox Code Playgroud)

你发现*__t的值在++(*this)之后改变了!

进一步深入你会发现,

*__t 实际上是通过返回内部 value_type 指针 _ result来实现的,而 _ result实际上指向 &_位置->prefix() ,即 match_results 的 _ prefix对象的地址,这个对象的地址从未改变,但是 _ result 的内容它改变了。