问题描述
可以使用 /
运算符在一行中append 多个路径:
std::filesystem::path p1{"A"};
auto p2 = p1 / "B" / "C";
比较方便。但是,concat 只提供 +=
:
std::filesystem::path p1{"A"};
auto p2 = p1 / "B" / "C" + ".d"; // NOT OK
这很烦人,因为我无法轻松地在路径的末尾添加扩展。我别无选择,只能写类似
std::filesystem::path p1{"A"};
auto p2 = p1 / "B" / "C";
p2 += ".d";
我错过了什么吗?这种不一致有什么原因吗?
解决方法
这有点推测性,但我认为这样做的原因是 operator+
很容易与 operator/
混淆。如果按以下方式使用,则会导致错误
path p2{"/"};
auto p1 = p2 + "A" + "B";
// Wants /A/B,gets /AB
使用字符串文字使解决方法更好:
using namespace std::literals;
std::filesystem::path p1{"A"};
auto p2 = p1 / "B" / ("C"s + ".d");
此处,"C"s
创建了一个内容为 std::string
的 C
,然后我们使用 std::string
的 operator+
。如果 "C"
部分本身已经是一条路径(否则你可以只写 "C.d"
开始),你可以做
std::filesystem::path p1{"A"},c_path{"C"};
auto p2 = p1 / "B" / (c_path += ".d");
因为 operator+=
返回结果对象。 (这有点浪费,但我可以想象编译器会优化它)。