【发布时间】:2020-04-13 16:44:38
【问题描述】:
给定以下代码:
fs::path p{ "a/b/" };
fs::path q{ "a/b/." };
assert(p == q);
[注意定义 q 的字符串末尾的额外点。]
根据上述情况,boost::filesystem 接受 p == q 为真,但 gcc 和 llvm 的 std::filesystem 实现说它是假的。
为什么 boost 和 std 之间存在差异?
附:在这个问题的先前版本中,我错误地认为在比较之前应该对路径进行规范化。事实并非如此。即便如此,boost 和 std 之间的差异对我来说仍然是一个谜。
【问题讨论】:
-
你为什么希望它们比较相等?
-
Dot 确实引用了它自己,为什么不呢?
-
恕我直言好多了。也许我应该告诉你,虽然我对任何事情都感兴趣,但我对任何事情都无能为力。虽然要知道我是否可以先尝试理解这个问题。抱歉,如果我提出了错误的期望,但如果您同意这是一种改进,那当然不是为了我,而是为了您增加获得答案的机会
-
"按照我的理解,比较应该在路径归一化后进行。"为什么?我会说
"a/b/"和"a/b/."是命名相同条目的不同路径 -
@ Caleth:a) 第一个原因,正如我在问题中提到的,是“a/.././b”和“a///..//.// //b" 比较相等。它们是命名相同条目的不同路径,以使用您的语言,但它们比较相等。这意味着某种规范化正在进行中。 b) 重要的是,Boost 不同意你的观点。
标签: c++ boost-filesystem std-filesystem