std::filesystem::path::append, std::filesystem::path::operator/=
来自cppreference.com
< cpp | filesystem | path
path& operator/=(const path& p); |
(1) | (C++17 起) |
template< class Source > path& operator/=( const Source& source ); |
(2) | (C++17 起) |
template< class Source > path& append( const Source& source ); |
(3) | (C++17 起) |
template< class InputIt > path& append( InputIt first, InputIt last ); |
(4) | (C++17 起) |
1) 若 p.is_absolute() || (p.has_root_name() && p.root_name() != root_name()) ,则以 p 替换当前路径,如同用 operator=(p) 并终止。
* 否则,若 p.has_root_directory() ,则移除 *this 的通用格式路径名的任何根目录及整个相对路径
* 否则,若 has_filename() || (!has_root_directory() && is_absolute()) ,则附加
path::preferred_separator
到 *this 的通用格式 * 用以上之一处理后,附加
p
的原生格式路径名,从其通用格式忽略任何 root-name ,到 *this 的原生格式。// 其中 "//host" 是根名 path("//host") / "foo" // 结果是 "//host/foo" (附加分隔符) path("//host/") / "foo" // 结果亦为 "//host/foo" (附加,无分隔符) // POSIX 上, path("foo") / "" // 结果是 "foo/" (附加) path("foo") / "/bar"; // 结果是 "/bar" (替换) // Windows 上, path("foo") / "C:/bar"; // 结果是 "C:/bar" (替换) path("foo") / "C:"; // 结果是 "C:" (替换) path("C:") / ""; // 结果是 "C:" (附加,不带分隔符) path("C:foo") / "/bar"; // 生成 "C:/bar" (移除相对路径后附加) path("C:foo") / "C:bar"; // 生成 "C:foo/bar" (附加,忽略 p 的根名)
2,3) 同 (1) ,除了接受任何 std::basic_string 、 std::basic_string_view ,空终止多字符字符串,或指向空终止多字符序列的输入迭代器。等价于 return operator/=(path(source)); 。
4) 同 (1) ,但接受任何指代多字符字符串的迭代器对。等价于 return operator/=(path(first, last));
(2) 与 (3) 仅若 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 、空终止多字节/宽字符串、或指向空终止多字符序列的输入迭代器,它表示路径名(以可移植或原生格式) |
first, last | - | 一对指定表示路径名的多字符序列的老式输入迭代器 (LegacyInputIterator) |
类型要求 | ||
-InputIt 必须符合老式输入迭代器 (LegacyInputIterator) 的要求。
| ||
-InputIt 的 value_type 必须是编码字符( char 、 wchar_t 、 char16_t 及 char32_t )类型之一
|
返回值
*this
异常
若内存分配失败则可能抛出 std::bad_alloc 。
注意
这些函数等效地生成以 *this
为起始目录的环境中,参数路径 p
的含义估计。
示例
运行此代码
#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path p1 = "C:"; p1 /= "Users"; // 不插入分隔符 std::cout << R"("C:" / "Users" == )" << p1 << '\n'; p1 /= "batman"; // 插入 fs::path::preferred_separator ,在 Windows 上为 '\' std::cout << R"("C:" / "Users" / "batman" == )" << p1 << '\n'; }
可能的输出:
"C:" / "Users" == "C:Users" "C:" / "Users" / "batman" == "C:Users\batman"
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3244 | C++17 | 缺失 Source 不能为 path 的制约
|
已添加 |
参阅
连接二个路径而不加入目录分隔符 (公开成员函数) | |
用目录分隔符连接二个路径 (函数) |