为什么尾随分隔符会改变 Boost.Filesystem 中相对路径转换的行为?

Why do trailing separators change the behavior of relative path conversions in Boost.Filesystem?

给定以下代码,

namespace fs = boost::filesystem;
fs::path parentPath("/home/user1/");
fs::path childPath("/home/user1/Downloads/Books");
std::cout << childPath.lexically_relative(parentPath) << '\n';

我希望输出为 "Downloads/Books",但实际上是 "../Downloads/Books"。如果我将 parentPath 更改为 "/home/user1"(删除尾随分隔符),我会得到预期的输出。

在我的 真实 代码中,路径通常以来自数据的字符串形式出现。在我的上下文中,末尾的尾部斜杠是无意的,出于任何逻辑目的都应忽略。基本上,在我的程序中 "/home/user1""/home/user1/" 相同。然而 boost::filesystem::path 的逻辑并不反映这个断言。

所以我的问题有两个:

  1. 为什么尾随分隔符会影响行为?我只是不太明白为什么在这种情况下它会使用 ".." 升级目录。

  2. 如何让 path 在我的程序中全局忽略或规范化尾部斜杠?例如,在构造 path 对象之前 "sanitizing" 我的路径字符串会造成过多的维护负担,因此如果可能,我需要一些更固有的东西。

这是我用来测试的live sample

我在发布这个问题后不久发现这是一个错误,reported here。我最初以为我可能做错了什么。尽管此时我的问题没有多大意义,但我不想删除它以防其他人 运行 遇到同样的问题。