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)。允许使用任何字符类型 char、char8_t、(自 C++20 起)char16_t、char32_t、wchar_t,并且转换为原生字符集的方法取决于 source 使用的字符类型。
- 如果源字符类型是 char,则假定源的编码是原生窄编码(因此在 POSIX 系统上不进行转换)。
|
(自 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_type
是 wchar_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) 仅当 Source
和 path
不是同一类型,并且满足以下条件之一时才参与重载解析:
-
Source
是 std::basic_string 或 std::basic_string_view 的特化,或者 - std::iterator_traits<std::decay_t<Source>>::value_type 有效并表示可能带有 const 限定符的编码字符类型(char、char8_t、(自 C++20 起)char16_t、char32_t 或 wchar_t)。
内容 |
[编辑] 参数
p | - | 要复制的路径 |
source | - | std::basic_string、std::basic_string_view、指向空终止字符字符串的指针,或具有字符值类型的输入迭代器,该迭代器指向空终止字符序列(对于重载 (7),字符类型必须为 char) |
first, last | - | 指定字符序列的 LegacyInputIterator 对 |
fmt | - | path::format 类型的枚举器,用于指定如何解释路径名格式 |
loc | - | 定义要使用的编码转换的区域设置 |
类型要求 | ||
-InputIt 必须满足 LegacyInputIterator 的要求。 | ||
-InputIt 的值类型必须是字符类型 char、wchar_t、char8_t、(自 C++20 起)char16_t 和 char32_t 之一,才能使用重载 (6)。 | ||
-InputIt 的值类型必须是 char,才能使用重载 (8)。 |
[编辑] 异常
2,4-8) 可能抛出实现定义的异常。
[编辑] 注解
对于从 Unicode 字符串生成可移植路径名,请参见 |
(直到 C++20) |
当源是 char8_t 序列时, |
(自 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 (函数) |