`std::filesystem::path` 没有反向迭代器吗?

问题描述

std::filesystem::path 不提供反向迭代器(即 rbeginrend)是否存在技术原因?

如果我有 std::filesystem::path/a/b/c/b/d/b/e 并且我想找到匹配 b 的第一个组件,我可以使用 std::find(p.begin(),p.end(),fs::path("b"))

但是如果我想找到与 b 匹配的 last 组件,我不能只切换到反向迭代器。我可以编写自己的循环,但这似乎是一个“几乎可以免费”实现的常见操作。

界面设计中是否存在难以提供反向迭代器的问题?

解决方法

根据 cppreference.com 的这个页面:

"std::reverse_iterator 不适用于其解引用返回对 *this 成员的引用的迭代器(所谓的“存储迭代器”)。存储迭代器的一个示例是 std::filesystem::path::迭代器。”

同样来自 boost.org 的一个页面,上面写着:

路径迭代器在内部存储它们的值对象,并在取消引用时返回对这些内部对象的引用。它们不能与迭代器适配器一起使用,例如 std::reverse_iterator 假定通过解引用迭代器获得的引用指向比迭代器本身寿命更长的对象。

要查找有关隐藏迭代器的更详细说明,请访问 this page