为什么 boost::filesystem::path 和 std::filesystem::path 缺少 operator+?
Why do boost::filesystem::path and std::filesystem::path lack operator+?
考虑以下关于路径分解的断言,其中每个局部变量,例如stem
有明显的初始化,例如auto stem = path.stem()
—
assert(root_path == root_name / root_directory);
assert(path == root_name / root_directory / relative_path);
assert(path == root_path / relative_path);
assert(path == parent_path / filename);
assert(filename == stem + extension);
这一切都有效,除了最后一行 — 因为 fs::path
没有定义 operator+
。它有 operator+=
,但没有 operator+
。
这是怎么回事?
我确定我可以通过添加自己的 operator+
来编译此代码。有什么理由不这样做吗? (注意这是在我自己的命名空间中;我不会重新打开 namespace std
。)
fs::path operator+(fs::path a, const fs::path& b)
{
a += b;
return a;
}
我对这个问题的唯一假设是:
也许设计者担心 operator+
太容易与 std::string
的 operator+
混淆。但这看起来很愚蠢,因为它在语义上做了完全相同的事情(所以为什么要关心它是否被混淆了?)。而且当设计者设计 path.append("x")
来做一些与 str.append("x")
和 path.concat("x")
在语义上 不同 的事情时,设计师似乎并不关心新手的困惑在语义上与str.append("x")
相同。
也许 path
的隐式转换 operator string_type() const
会导致某些种类的 p + q
变得不明确。但是我一直无法想出任何这样的案例。
这是作为文件系统库的缺陷输入的,并且由于接口的复杂性和通过转换为字符串并返回路径来变通的能力,它被判断为不是缺陷。在这里阅读所有相关信息:https://timsong-cpp.github.io/lwg-issues/2668
考虑以下关于路径分解的断言,其中每个局部变量,例如stem
有明显的初始化,例如auto stem = path.stem()
—
assert(root_path == root_name / root_directory);
assert(path == root_name / root_directory / relative_path);
assert(path == root_path / relative_path);
assert(path == parent_path / filename);
assert(filename == stem + extension);
这一切都有效,除了最后一行 — 因为 fs::path
没有定义 operator+
。它有 operator+=
,但没有 operator+
。
这是怎么回事?
我确定我可以通过添加自己的 operator+
来编译此代码。有什么理由不这样做吗? (注意这是在我自己的命名空间中;我不会重新打开 namespace std
。)
fs::path operator+(fs::path a, const fs::path& b)
{
a += b;
return a;
}
我对这个问题的唯一假设是:
也许设计者担心
operator+
太容易与std::string
的operator+
混淆。但这看起来很愚蠢,因为它在语义上做了完全相同的事情(所以为什么要关心它是否被混淆了?)。而且当设计者设计path.append("x")
来做一些与str.append("x")
和path.concat("x")
在语义上 不同 的事情时,设计师似乎并不关心新手的困惑在语义上与str.append("x")
相同。也许
path
的隐式转换operator string_type() const
会导致某些种类的p + q
变得不明确。但是我一直无法想出任何这样的案例。
这是作为文件系统库的缺陷输入的,并且由于接口的复杂性和通过转换为字符串并返回路径来变通的能力,它被判断为不是缺陷。在这里阅读所有相关信息:https://timsong-cpp.github.io/lwg-issues/2668