我正在使用基于范围的for循环,以使用迭代器读取(和解析)文件。我的循环如下所示:

for (auto record : reader) {
    if (even)
        record.reverse_complement();
    cout << record.write();
    even = !even;
}

我已经将输出添加到迭代器的构造函数和析构函数中,在for循环的每次迭代中,看起来析构函数都是在end()返回的迭代器上被良性调用的。
calling fq_iter FULL constructor
calling fq_iter default constructor
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_iter destructor on 0
calling fq_reader destructor on 0

这些是我用来解析和遍历文件的类,您知道为什么每次迭代都调用析构函数吗? (除此之外,它会产生正确的输出)。

最佳答案

根据C++标准的6.5.4节,您的编译器不应该这样做。相反,应该将最终迭代器缓存在一个无法命名的本地中。

您的operator!=是否会复制迭代器(偶然的值传递)?

09-07 09:14