为什么不能从`std :: filesystem :: path`迭代器构造`std :: filesystem :: path`?

Ton*_*vel 12 c++ c++17 std-filesystem

下面的代码旨在剥离路径的第一部分,以防它存在:

#include <filesystem>

std::filesystem::path strip_prefix(std::filesystem::path p)
{      
  if (auto it{p.begin()}; it != p.end())
  {
    ++it;
    return std::filesystem::path(it, p.end());
  }

  return p;
}
Run Code Online (Sandbox Code Playgroud)

(见:https://godbolt.org/z/wkXhcw)

我很惊讶地发现这不起作用.代码无法编译,因为路径构造函数只接受迭代字符序列的迭代器.我可以看到使用它,但为什么限制只有那些迭代器的构造?在我看来,不支持从自己的迭代器构造路径是违反直觉的.据我所知,大多数其他STL类型确实支持这个成语.

除了完全重建新路径之外,实现相同目标的有效实现是什么?

更新:在此背景下,我发现以下讨论相关/有趣:http://boost.2283326.n4.nabble.com/boost-filesystem-path-frustration-td4641734.html.我同意戴夫的观点.我认为将路径视为路径元素的容器是一种非常自然的方式来看待它.

Par*_*tes 5

连接段以创建新段的最简单解决方案path是just std::accumulate()

对于您的特定用例,我将执行以下操作:

std::filesystem::path strip_prefix(std::filesystem::path p)
{
    if(p.empty()) return p;
    return std::accumulate(std::next(p.begin()), p.end(), 
                           std::filesystem::path{}, std::divides{});
}
Run Code Online (Sandbox Code Playgroud)

至于为什么没有构造函数(或者可能是自由函数)来做到这一点呢?我不知道。在使用路径时,这似乎有点需要,但是如果通过调用标准算法可以达到相同的结果,委员会确实不愿意在标准类中添加便利功能。