C++ 为什么std::filesystem::path::compare()和boost::filesystem::path::compare()不同?

C++ 为什么std::filesystem::path::compare()和boost::filesystem::path::compare()不同?,c++,boost-filesystem,std-filesystem,C++,Boost Filesystem,Std Filesystem,给定以下代码: fs::path p{ "a/b/" }; fs::path q{ "a/b/." }; assert(p == q); [请注意定义q的字符串末尾的额外点。] 在上面的例子中,boost::filesystem接受p==q为true,但gcc和llvm对std::filesystem的实现称其为false 为什么boost和std之间存在差异 另外,在这个问题的以前版本中,我错误地认为路径应该在比较之前被规范化。事实并非如此。即便如此,boo

给定以下代码:

  fs::path p{ "a/b/" };
  fs::path q{ "a/b/." };  
  assert(p == q);         
[请注意定义q的字符串末尾的额外点。]

在上面的例子中,boost::filesystem接受p==q为true,但gcc和llvm对std::filesystem的实现称其为false

为什么boost和std之间存在差异


另外,在这个问题的以前版本中,我错误地认为路径应该在比较之前被规范化。事实并非如此。即便如此,boost和std之间的差异对我来说仍然是个谜。

简单的回答是,Unix上的
是一个实际的文件系统节点链接,这有时很重要。看

编辑


然而,我不能假定知道标准委员会关于文件系统库行为的意图,我也不认为库对Unix符号链接行为了解那么多是合理的。简言之,这可能只是标准措辞和Boost关于事情应该如何运作的观点之间的矛盾

为什么你们会期望它们是相等的呢?圆点指的是它自己,所以为什么不呢?比imho好得多。也许我应该告诉你,虽然我对任何事情都感兴趣,但我对任何事情都无能为力。虽然我想知道我是否可以,但我首先试着理解这个问题。对不起,如果我提出了错误的期望,但是如果你能同意这是一种改进,那么当然不是我的改进,而是你的改进,增加了获得答案的机会“按照我的理解,应该在路径正常化后进行比较。”为什么?我想说,
“a/b/”
“a/b/”
是命名同一条目的不同路径@Caleth:a)正如我在问题中提到的,第一个原因是“a/。///b”和“a///。///b”比较相等。使用您的语言,它们是命名相同条目的不同路径,但它们的比较结果相同。这意味着某种形式的正常化正在进行。b) 重要的是,Boost不同意您的观点。据我所知,路径比较是在不访问文件系统的情况下执行的。恐怕还不止这些。@好奇的是:“路径比较是在不访问文件系统的情况下执行的”,但路径比较的定义方式必须确保,如果两条路径相等,它们肯定应该在文件系统中命名相同的实体。如果在某些情况下,
可以被视为不同的实体,那么逻辑路径相等性测试必须识别出这一点。@Nicol Bolas:正确。这就是为什么该标准有“规范化”路径的规则。例如,在标准中,您可以参考:29.11.7.1通用路径名格式[fs.path.Generic],特别是第6小节:通用格式路径名的规范化。再一次,请参阅我的完整帖子,以及我对Caleth的回复。特别是我的最后一点:boost提供了一个不同的答案。