std::filesystem::path::path
来自cppreference.com
<tbody>
</tbody>
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) 从
source (4,5) 提供的字符序列构造路径(按 fmt 指定的格式转译),源可以是一个指向空终值字符/宽字符序列的指针或输入迭代器,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,则输入被假定为原生宽字符编码(故在 Windos 上不用转换)
- 若源字符类型是
7,8) 从
source (7) 提供的从字符序列构造路径(按 fmt 指定的格式转译),源可以是指向空终止字符序列的指针或输入迭代器,std::string,std::basic_string_view,或由一对输入迭代器 [first, last) (8) 所代表。仅允许的字符类型是 char。用 loc 进行字符编码转换。若 value_type 是 wchar_t,则使用 loc 的 std::codecvt<wchar_t, char, std::mbstate_t> 平面从宽字符转换。否则,首先用 std::codecvt<wchar_t, char, std::mbstate_t> 平面转换到宽字符,再用 loc 的 std::codecvt<wchar_t,value_type> 平面转换到文件系统原生字符类型。仅若 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)
(5) 与 (7) 才参与重载决议。
参数
| p | - | 要复制的路径 |
| source | - | std::basic_string,std::basic_string_view,指向空终止字符串的指针,或拥有字符值类型并指向空终止字符序列的的输入迭代器(对于重载 (7) 字符类型必须是 char)
|
| first, last | - | 一对指定字符序列的老式输入迭代器 (LegacyInputIterator) |
| fmt | - | path::format 类型的枚举项,指定路径名格式如何转译 |
| loc | - | 定义编码转换所用的本地环境 |
| 类型要求 | ||
-InputIt 必须满足老式输入迭代器 (LegacyInputIterator) 。
| ||
-InputIt 的值类型必须是字符类型 char、char8_t(C++20 起)、wchar_t、char16_t 及 char32_t 之一,以使用重载 (6)。
| ||
-InputIt 的值类型必须是 char,以使用 (8)。
| ||
异常
2,4-8) 可能会抛出由实现定义的异常。
注解
|
关于从 Unicode 字符串生成可移植路径名,见 |
(C++20 前) |
|
源为 |
(C++20 起) |
示例
运行此代码
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
fs::path p1 = "/usr/lib/sendmail.cf"; // 可移植格式
fs::path p2 = "C:\\users\\abcdef\\AppData\\Local\\Temp\\"; // 原生格式
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++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3244 | C++17 | 缺失 Source 不能为 path 的制约
|
已添加 |
参阅
(C++17)(C++20 弃用) |
从 UTF-8 编码的源创建 path (函数) |