为什么更改调用std::regex::str和std::regex::suffix的顺序会改变行为?

3

我写了一些工作代码,可以打印出连续出现两个元音的每一个实例。

std::regex x("(a|e|i|o|u){2}");

std::smatch r;

std::string t = some_string;

while (std::regex_search(t, r, x)) {
    std::cout << "match: " << r.str() << '\n';

    t = r.suffix();
}

但是当我像这样改变顺序:

while (std::regex_search(t, r, x)) {
    t = r.suffix();

    std::cout << "match: " << r.str() << '\n';
}

它突然开始给出随机结果。我看不出这两行之间的联系,以及改变它们的顺序为什么会影响任何事情。有人能解释一下吗?

1个回答

6
这个声明:
    t = r.suffix();

并不是创建新的字符串对象,或者改变字符串对象 t 的指向,或者类似这样的操作;相反,它通过复制 r.suffix() 的内容来改变现有的字符串对象。

r 不持有实际的字符串数据;它只持有索引信息,以便可以从 t 中提取适当的字符串数据。改变 t 实际上使旧的索引无效,因此您会得到错误的字符串数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接