C++ 无操作员+;对于std::filesystem::path?

C++ 无操作员+;对于std::filesystem::path?,c++,std-filesystem,C++,Std Filesystem,可以使用/运算符在一行中创建多个路径: std::filesystem::path p1{"A"}; auto p2 = p1 / "B" / "C"; 这相当方便。但是,仅提供+=: std::filesystem::path p1{"A"}; auto p2 = p1 / "B" / "C" + ".d"; // NOT OK 这

可以使用
/
运算符在一行中创建多个路径:

  std::filesystem::path p1{"A"};
  auto p2 = p1 / "B" / "C";
这相当方便。但是,仅提供
+=

  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";

我错过什么了吗?这种不一致性有什么原因吗?

这是一种推测,但我认为原因是
运算符+
很容易与
运算符混为一谈。如果按如下方式使用,则会导致错误

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
创建一个内容为
C
std::string
,然后我们使用
std::string
操作符+
。如果
“C”
部分本身已经是一个路径(否则您可以先编写
“C.d”
),您可以这样做

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

因为
操作符+=
返回结果对象。(这有点浪费,但我可以想象编译器会对此进行优化)。

没有。没有别的了way@KamilCuk使用
const char[N]
不可能,这将是
auto p2=p1/“B/(std::string(“C”)+“.d”)
(“C”+“.d”)
添加两个
常量字符[2]
s@KamilCuk像“a”这样的字符串文字属于“const char[N]”类型,并且在使用运算符+”时将转换为“const char*”,因此您将使用
“a”+“B”
sooo添加两个指针<代码>自动p2=p1/“B”/“C”+=“.d”
自动p2=p1/“B”/(std::string()+“C”+“.d”):D。这两种方法都适用<代码>注意,在实践中,“C”很可能不在实践中,在任何情况下,
p1/“B”/“C”
的结果具有类型
std::filesystem::path
,因此它在其上执行
+=
。不过,这并不是一个答案,因为我不知道“这种不一致的原因”。