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_stringstd::basic_string_view ,空终止多字符字符串,或指向空终止多字符序列的输入迭代器。等价于 return operator/=(path(source));
4)(1) ,但接受任何指代多字符字符串的迭代器对。等价于 return operator/=(path(first, last));

(2)(3) 仅若 Sourcepath 不是同一类型,而且:

才参与重载决议

参数

p - 要添加的路径
source - std::basic_stringstd::basic_string_view 、空终止多字节/宽字符串、或指向空终止多字符序列的输入迭代器,它表示路径名(以可移植或原生格式)
first, last - 一对指定表示路径名的多字符序列的老式输入迭代器 (LegacyInputIterator)
类型要求
-
InputIt 必须符合老式输入迭代器 (LegacyInputIterator) 的要求。
-
InputIt 的 value_type 必须是编码字符( charwchar_tchar16_tchar32_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 的制约 已添加

参阅

连接二个路径而不加入目录分隔符
(公开成员函数)
用目录分隔符连接二个路径
(函数)