首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex_token_iterator *it++错误?

regex_token_iterator *it++错误?
EN

Stack Overflow用户
提问于 2013-12-02 16:19:55
回答 1查看 349关注 0票数 7

对于以下代码:

代码语言:javascript
复制
#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;
}

应输出:

代码语言:javascript
复制
Split
Values
Separated
By
Slashes

但它会输出以下内容:

代码语言:javascript
复制
Values
Separated
By

Slashes

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

当我将c++11正则表达式的展位改为boost-regex时,*it++也可以正常工作。

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

我的clang版本是

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2014-01-07 10:57:22

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

转到regex,插入以下两行

代码语言:javascript
复制
    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对象的地址,这个对象的地址从来没有改变,但是它的内容改变了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20323648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档