为什么基于 c++ 范围的 for 循环在每次迭代时都调用析构函数?

Car*_*iro 2 c++ foreach iterator destructor

我正在使用基于范围的 for 循环来使用迭代器读取(和解析)文件。我的循环看起来像这样:

for (auto record : reader) {
    if (even)
        record.reverse_complement();
    cout << record.write();
    even = !even;
} 
Run Code Online (Sandbox Code Playgroud)

我已经向迭代器的构造函数和析构函数添加了输出,看起来在 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
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 5

根据 C++ 标准的第 6.5.4 节,您的编译器不应该这样做。相反,它应该在无法命名的本地缓存结束迭代器。

您是否operator!=制作了迭代器的副本(意外传递值)?