为什么路径的迭代器在遍历时返回“ \\”?

Pav*_*Dev 12 c++ c++17

我正在使用带有文件系统API的新的和现代的C ++ 17。我正在Windows中使用Visual Studio 2017。

以下代码给出了意外的结果:

#include <iostream>
#include <filesystem>

int main()
{
  std::filesystem::path path(R"(D:\dir\file.cpp)");
  for (auto& dir : path)
  {
    std::cout<<dir<<std::endl;
  }
}

Run Code Online (Sandbox Code Playgroud)

结果是:

"D:"
"\\"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)

为什么打印“ \\”?

在GCC 9.1.0中对此进行测试(请在路径变量中将“ \”更改为“ /”),结果是:

"D:"
"dir"
"file.cpp"
Run Code Online (Sandbox Code Playgroud)

为什么行为不同?

根据C ++ 17标准,哪个结果正确?

Art*_*yer 9

有关Windows路径名的一些信息,请参见https://docs.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file#fully-qualified-vs-relative-paths

C ++标准对路径迭代器([fs.path.itr] / 4)有这样的说法:

对于通用格式的路径名元素,正向遍历顺序如下:

  • 根名称元素,如果存在的话。
  • 所述根目录元素,如果存在的话。[?注:必须使用通用格式,以确保词典比较正确地进行。-?尾注]
  • 每个连续的文件名元素(如果存在)。
  • 如果存在尾随的非根目录分隔符,则为空元素。

在Windows中,路径D:\dir\file.cpp有一个磁盘代号D:,其次是盘上的根目录下,\,那么路径dirfile.cpp。根据Windows,D:根目录名\是根目录。您可能有D:dir\file.cpp,但请注意,这现在是相对路径。

在gcc上(如果不在Windows上)D:将被视为常规目录名称(与相同./D:/dir/file.cpp)。因此,没有根名称或根目录。如果你已经不是了/D:/dir/file.cpp,迭代器将不包含/D:dirfile.cpp