std::filesystem::path 没有运算符+?

问题描述

可以使用 / 运算符在一行中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::stringC,然后我们使用 std::stringoperator+。如果 "C" 部分本身已经是一条路径(否则你可以只写 "C.d" 开始),你可以做

std::filesystem::path p1{"A"},c_path{"C"};
auto p2 = p1 / "B" / (c_path += ".d");   

因为 operator+= 返回结果对象。 (这有点浪费,但我可以想象编译器会优化它)。