std::filesystem::path::append, std::filesystem::path::operator/=
Von cppreference.com
< cpp | filesystem | path
| path& operator/=( const path& p ); |
(1) | (seit C++17) |
| template< class Source > path& operator/=( const Source& source ); |
(2) | (seit C++17) |
| template< class Source > path& append( const Source& source ); |
(3) | (seit C++17) |
| template< class InputIt > path& append( InputIt first, InputIt last ); |
(4) | (seit C++17) |
1) Wenn p.is_absolute() || (p.has_root_name() && p.root_name() != root_name()) ist, dann wird der aktuelle Pfad durch p ersetzt, als ob durch operator=(p) und die Funktion beendet.
* Andernfalls, wenn p.has_root_directory() ist, dann werden das Wurzelverzeichnis und der gesamte relative Pfad aus dem generischen Pfadnamen von *this entfernt.
* Andernfalls, wenn has_filename() || (!has_root_directory() && is_absolute()) ist, dann wird
path::preferred_separator an den generischen Pfad von *this angehängt. * In jedem Fall wird dann der native Pfadname von p, wobei ein eventueller Wurzelname aus seinem generischen Format weggelassen wird, an den nativen Pfad von *this angehängt.
// Where "//host" is a root-name path("//host") / "foo" // the result is "//host/foo" (appends with separator) path("//host/") / "foo" // the result is also "//host/foo" (appends without separator) // On POSIX, path("foo") / "" // the result is "foo/" (appends) path("foo") / "/bar"; // the result is "/bar" (replaces) // On Windows, path("foo") / "C:/bar"; // the result is "C:/bar" (replaces) path("foo") / "C:"; // the result is "C:" (replaces) path("C:") / ""; // the result is "C:" (appends, without separator) path("C:foo") / "/bar"; // yields "C:/bar" (removes relative path, then appends) path("C:foo") / "C:bar"; // yields "C:foo/bar" (appends, omitting p's root-name)
2,3) Identisch mit (1), aber akzeptiert jede std::basic_string, std::basic_string_view, null-terminierte Multizeichenkette oder einen Eingabeiterator, der auf eine null-terminierte Multizeichenkette zeigt. Entspricht return operator/=(path(source));.
4) Identisch mit (1), aber akzeptiert jedes Iterator-Paar, das eine Multizeichenkette bezeichnet. Entspricht return operator/=(path(first, last));.
(2) und (3) nehmen nur an der Überladungsauflösung teil, wenn Source und path nicht vom gleichen Typ sind, und entweder
-
Sourceeine Spezialisierung von std::basic_string oder std::basic_string_view ist, oder - std::iterator_traits<std::decay_t<Source>>::value_type gültig ist und einen möglicherweise konstant qualifizierten Zeichentyp vom Codierungstyp bezeichnet (char, char8_t, (seit C++20)char16_t, char32_t oder wchar_t).
Inhalt |
[edit] Parameter
| p | - | anzuhängender Pfadname |
| source | - | std::basic_string, std::basic_string_view, null-terminierte Multizeichenkette oder ein Eingabeiterator, der auf eine null-terminierte Multizeichenkette zeigt, die einen Pfadnamen darstellt (entweder im portablen oder nativen Format) |
| first, last | - | Paar von LegacyInputIteratoren, die eine Multizeichenkette bezeichnen, die einen Pfadnamen darstellt |
| Typanforderungen | ||
-InputIt muss die Anforderungen von LegacyInputIterator erfüllen. | ||
-Der Werttyp von InputIt muss einer der kodierten Zeichentypen sein (char, wchar_t, char16_t und char32_t). | ||
[edit] Rückgabewert
*this
[edit] Ausnahmen
Kann std::bad_alloc auslösen, wenn die Speicherzuweisung fehlschlägt.
[edit] Hinweise
Diese Funktionen ergeben effektiv eine Annäherung an die Bedeutung des Argumentpfads p in einer Umgebung, in der *this das Startverzeichnis ist.
[edit] Beispiel
Die Ausgabe wird unter Windows erzeugt.
Führen Sie diesen Code aus
#include <filesystem> #include <iostream> namespace fs = std::filesystem; int main() { fs::path p1 = "C:"; p1 /= "Users"; // does not insert a separator std::cout << "\"C:\" / \"Users\" == " << p1 << '\n'; p1 /= "batman"; // inserts fs::path::preferred_separator, '\' on Windows std::cout << "\"C:\" / \"Users\" / \"batman\" == " << p1 << '\n'; }
Mögliche Ausgabe
"C:" / "Users" == "C:Users" "C:" / "Users" / "batman" == "C:Users\\batman"
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3244 | C++17 | Es fehlte die Bedingung, dass Source nicht path sein kann |
hinzugefügt |
[edit] Siehe auch
| verkettet zwei Pfade ohne Einführung eines Verzeichnistrenners (public member function) | |
| (C++17) |
verkettet zwei Pfade mit einem Verzeichnistrenner (function) |