1

std::filesystem在 gcc 6.3.1 中使用了实验性的实现,并且遇到了一些关于std::experimental::filesystem::directory_iteratorand的非常意外的行为std::distance。具体来说,在调用 之后std::distance,原始迭代器似乎已被修改。

经过一堆无果的调试试图在我的代码中找到逻辑错误,我开始在实现中挖掘directory_iterator,最后发现迭代器在std::shared_ptr内部使用,有一个默认的复制构造函数,我假设operator++必须直接递增托管指针。

以下代码重现了该问题:

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

int main() {
  auto it = fs::directory_iterator("/etc");
  std::cout << *it << std::endl;
  std::distance(it, fs::directory_iterator{});
  std::cout << *it << std::endl;
}

由于这种实现在传递给期望具有传统值语义的迭代器(据我所知的所有 STL 算法)的函数时会产生非常违反直觉的结果,我很难相信这是预期的行为,但是我犹豫要不要打电话给错误。

显然,这个 API 在发布时是实验性的,但我认为它旨在成为文件系统 TS 的忠实实现。我无法获得完全C++17支持的编译器,所以我一直希望在此期间使用它。

这是预期的行为,我应该期望directory_iterator在未来的版本中以这种方式工作吗?暂时我想我可以使用boost::filesystem.

谢谢!

4

1 回答 1

4

directory_iterators被定义为InputIterators,因此只能使用一次。没有 const 加法运算符,因此您必须使用修改迭代器的增量运算符。

于 2018-03-13T07:55:52.087 回答