std::filesystem::path::path

来自cppreference.com
< 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)source (4,5) 提供的字符序列构造路径(按 fmt 的指定转译格式),源可以是一个指向空终值字符/宽字符序列的指针或输入迭代器、 std::basic_stringstd::basic_string_view ,或作为一对输入迭代器 [first, last) 提供 (6) 。允许字符类型 char char8_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 ,则输入被假定为原生宽字符编码(故在 Windos 上不用转换)
7-8)source (7) 提供的从字符序列构造路径(按 fmt 的指定转译格式),源可以是指向空终止字符序列的指针或输入迭代器、 std::stringstd::basic_string_view ,或由一对输入迭代器 [first, last) (8) 所代表。仅允许的字符类型是 char 。用 loc 进行字符编码转换。若 value_typewchar_t ,则使用 locstd::codecvt<wchar_t, char, std::mbstate_t> 平面从宽字符转换。否则,首先用 std::codecvt<wchar_t, char, std::mbstate_t> 平面转换到宽字符,再用 locstd::codecvt<wchar_t,value_type> 平面转换到文件系统原生字符类型。

(5)(7) 仅若 Sourcepath 不是同一类型,而且:

才参与重载决议

参数

p - 要复制的路径
source - std::basic_stringstd::basic_string_view ,指向空终止字符串的指针,或拥有字符 value_type 并指向空终止字符序列的的输入迭代器(对于重载 (6) 字符类型必须是 char
first, last - 一对指定字符序列的老式输入迭代器 (LegacyInputIterator)
fmt - path::format 类型的枚举项,指定路径名格式如何转译
loc - 定义编码转换所用的本地环境
类型要求
-
InputIt 必须满足老式输入迭代器 (LegacyInputIterator) 的要求。
-
InputIt 的 value_type 必须是字符类型 char char8_t (C++20 起)wchar_tchar16_tchar32_t 之一,以使用重载 (6)
-
InputIt 的 value_type 必须是 char ,以使用 (8)

异常

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

注解

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

(C++20 前)

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

(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 = L"D:/猫.txt"; // 宽字符串
 
    std::cout << "p1 = " << p1 << '\n'
              << "p2 = " << p2 << '\n'
              << "p3 = " << p3 << '\n';
}

输出:

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

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 3244 C++17 缺失 Source 不能为 path 的制约 已添加

参阅

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