gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:37:40 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com