c++ - std::experimental::directory_iterator 的意外别名

标签 c++ iterator std-filesystem c++-experimental

我在 gcc 6.3.1 中使用实验性 std::filesystem 实现,遇到了一些关于 std::experimental::filesystem::directory_iterator< 的非常意外的行为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

谢谢!

最佳答案

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

关于c++ - std::experimental::directory_iterator 的意外别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49250693/

相关文章:

android - 将图像从 ios/c++ 代码传递到 JNI Android

for-loop - 使用 for 循环遍历切片时跳过元素

python - 可变数量嵌套循环的迭代器

c++ - 如何从 std::filesystem::path 中删除引号

c++ - C++ 中 *--end() 是什么意思?

c++ - 即使在使用 skip_permission_denied 时,std::filesystem 递归迭代器也会抛出 permission_denied

c++ - 在已排序的双向链表中插入节点

c++ - C++中的指针内存分配

java - 迭代器 hasNext 意味着列表永远不会为空

c++ - 重复键的 bimap 使用