命名空间
变体
操作

std::filesystem::path::path

来自 cppreference.cn
< cpp‎ | filesystem‎ | path
 
 
 
 
path() noexcept;
(1) (自 C++17 起)
path( const path& p );
(2) (自 C++17 起)
path( path&& p ) noexcept;
(3) (自 C++17 起)
path( string_type&& source, format fmt = auto_format );
(4) (自 C++17 起)
template< class Source >
path( const Source& source, format fmt = auto_format );
(5) (自 C++17 起)
template< class InputIt >
path( InputIt first, InputIt last, format fmt = auto_format );
(6) (自 C++17 起)
template< class Source >
path( const Source& source, const std::locale& loc, format fmt = auto_format );
(7) (自 C++17 起)
template< class InputIt >
path( InputIt first, InputIt last, const std::locale& loc, format fmt = auto_format );
(8) (自 C++17 起)

构造一个新的 path 对象。

1) 构造一个空路径。
2) 复制构造函数。构造一个路径,其路径名(以原生和通用格式)与 p 的路径名相同。
3) 移动构造函数。构造一个路径,其路径名(以原生和通用格式)与 p 的路径名相同,p 留在有效但不指定的状态。
4-6) 从字符序列构造路径(格式解释由 fmt 指定),该字符序列由 source (4,5) 提供,它是一个指向空终止字符/宽字符序列的指针或输入迭代器,一个 std::basic_string 或一个 std::basic_string_view,或者表示为一对输入迭代器 [first, last) (6)。允许使用任何字符类型 charchar8_t(自 C++20 起)char16_tchar32_twchar_t,并且转换为原生字符集的方法取决于 source 使用的字符类型。
  • 如果源字符类型是 char,则假定源的编码是原生窄编码(因此在 POSIX 系统上不进行转换)。
  • 如果源字符类型是 char8_t,则使用从 UTF-8 到原生文件系统编码的转换。
(自 C++20 起)
  • 如果源字符类型是 char16_t,则使用从 UTF-16 到原生文件系统编码的转换。
  • 如果源字符类型是 char32_t,则使用从 UTF-32 到原生文件系统编码的转换。
  • 如果源字符类型是 wchar_t,则假定输入是原生宽编码(因此在 Windows 上不进行转换)。
7,8) 从字符序列构造路径(格式解释由 fmt 指定),该字符序列由 source (7) 提供,它是一个指向空终止字符序列的指针或输入迭代器,一个 std::string,一个 std::string_view,或者表示为一对输入迭代器 [first, last) (8)。唯一允许的字符类型是 char。使用 loc 执行字符编码转换。如果 value_typewchar_t,则使用 std::codecvt<wchar_t, char, std::mbstate_t> facet of loc 从 char 转换为宽字符。否则,首先使用 std::codecvt<wchar_t, char, std::mbstate_t> facet 转换为宽字符,然后使用 std::codecvt<wchar_t,value_type> facet of loc 转换为文件系统原生字符类型。

(5)(7) 仅当 Sourcepath 不是同一类型,并且满足以下条件之一时才参与重载解析:

内容

[编辑] 参数

p - 要复制的路径
source - std::basic_stringstd::basic_string_view、指向空终止字符字符串的指针,或具有字符值类型的输入迭代器,该迭代器指向空终止字符序列(对于重载 (7),字符类型必须为 char
first, last - 指定字符序列的 LegacyInputIterator
fmt - path::format 类型的枚举器,用于指定如何解释路径名格式
loc - 定义要使用的编码转换的区域设置
类型要求
-
InputIt 必须满足 LegacyInputIterator 的要求。
-
InputIt 的值类型必须是字符类型 charwchar_tchar8_t(自 C++20 起)char16_tchar32_t 之一,才能使用重载 (6)
-
InputIt 的值类型必须是 char,才能使用重载 (8)

[编辑] 异常

2,4-8) 可能抛出实现定义的异常。

[编辑] 注解

对于从 Unicode 字符串生成可移植路径名,请参见 u8path

(直到 C++20)

当源是 char8_t 序列时,path 构造函数支持从 UTF-8 字符串创建。

(自 C++20 起)

[编辑] 示例

#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
 
int main()
{
    fs::path p1 = "/usr/lib/sendmail.cf"; // portable format
    fs::path p2 = "C:\\users\\abcdef\\AppData\\Local\\Temp\\"; // native format
    fs::path p3 = U"D:/猫.txt"; // UTF-32 string
    fs::path p4 = u8"~/狗.txt"; // UTF-8 string
 
    std::cout << "p1 = " << p1 << '\n'
              << "p2 = " << p2 << '\n'
              << "p3 = " << p3 << '\n'
              << "p4 = " << p4 << '\n';
}

输出

p1 = "/usr/lib/sendmail.cf"
p2 = "C:\\users\\abcdef\\AppData\\Local\\Temp\\"
p3 = "D:/猫.txt"
p4 = "~/狗.txt"

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 3244 C++17 缺少 Source 不能是 path 的约束 已添加

[编辑] 参见

(C++17)(在 C++20 中已弃用)
从 UTF-8 编码的源创建 path
(函数) [编辑]