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