【发布时间】:2020-04-08 08:11:32
【问题描述】:
fs::path p1 = "/q/b";
fs::path p2 = "/";
std::cout << p1 / p2 << std::endl;
从这么多角度来看,这是完全出乎意料的:
- 完全合乎逻辑:appending(这就是操作的调用方式,对吗?)something to something 无法覆盖前者。
- 当前 Unix 路径行为:对于 Linux,“/a/b”与“/a/b/”、“/a/b//”、...相同,因此任何使用它会期望 附加 行为,而不是 覆盖。
-
安全:危险的事情(删除
fs::path的现有值)应该比安全/非破坏性的事情(只是增加fs::path的现有值)更难做。换句话说,当前行为仅依赖于某人手动检查正在发生的事情。如果您忘记写支票(路径是否从/开始)- 您就很不走运了。 -
最后:我不认为一个只想覆盖路径的人会使用
/而不是=。
我的主要问题,但是,假设的解决方案是什么?请想象一下 p2 路径作为函数的参数出现在您面前,它可能是 / 或 c/d 或 c。
我看到的一些(可怕的)选项:
- 我可以删除 libcxx 源中的第一个 if:
path& operator/=(const path& __p) {
if (__p.is_absolute()) {
__pn_ = __p.__pn_;
return *this;
}
继续使用
operator/- 但如果我想要更符合 Linux 行为,我需要进行一些检查吗?使用
concat, operator+=- 但在fs::path("a") + "b"的情况下不会添加分隔符/。
理想情况下,我想覆盖operator/...
有什么建议吗?
【问题讨论】:
标签: c++