std::filesy...::path::path(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… std::filesystem::path::path β€” the one and only

okay so this is std::filesystem::path::path(3), straight out of the C++ Standard Libary manual, and bestie, it's a lot β€” but it's literally just "how do I make a path object" and honestly? iconic. every single one of these is (since C++17), no cap. let's get into it 🌸


✨ Synopsis ✨

eight overloads. eight. and yes you're gonna learn all of them πŸ’–

path() noexcept;
(1) (since C++17)
   path( const path& p );
(2) (since C++17)
   path( path&& p ) noexcept;
(3) (since C++17)
   path( string_type&& source, format fmt = auto_format );
(4) (since C++17)
   template< class Source >
(5) (since C++17)
   path( const Source& source, format fmt = auto_format );
   template< class InputIt >
(6) (since C++17)
   path( InputIt first, InputIt last, format fmt = auto_format );
   template< class Source >
   path( const Source& source, const std::locale& loc, format fmt =
(7) (since C++17)
   auto_format );
   template< class InputIt >
   path( InputIt first, InputIt last, const std::locale& loc, format
(8) (since C++17)
   fmt = auto_format );

so what does this whole thing do? it constructs a new path object. that's the vibe πŸ¦‹

  1. Constructs an empty path. blank. empty. nothing. a clean slate ✨
  2. Copy constructor. Constructs a path whose pathname β€” in both native and generic formats β€” is the same as that of p. twin energy πŸ‘―
  3. Move constructor. Constructs a path whose pathname, in both native and generic formats, is the same as that of p, and p is left in a valid but unspecified state. it's giving "no thoughts head empty" but like, legally πŸ’€
  4. 4–6) Constructs the path from a character sequence (format interpreted as specified by fmt) provided by source (4, 5), which is a pointer or an input iterator to a null-terminated character/wide character sequence, an std::basic_string or an std::basic_string_view, or represented as a pair of input iterators [first, last) (6). Any of the character types char, char8_t (since C++20), char16_t, char32_t, wchar_t is allowed, and the method of conversion to the native character set depends on the character type used by source. 🧚
    • If the source character type is char, the encoding of the source is assumed to be the native narrow encoding (so no conversion takes place on POSIX systems).
    • If the source character type is char8_t (since C++20), conversion from UTF-8 to native filesystem encoding is used.
    • If the source character type is char16_t, conversion from UTF-16 to native filesystem encoding is used.
    • If the source character type is char32_t, conversion from UTF-32 to native filesystem encoding is used.
    • If the source character type is wchar_t, the input is assumed to be the native wide encoding (so no conversion takes places on Windows). πŸ“
  5. 7, 8) Constructs the path from a character sequence (format interpreted as specified by fmt) provided by source (7), which is a pointer or an input iterator to a null-terminated character sequence, an std::string, an std::string_view, or represented as a pair of input iterators [first, last) (8). The only character type allowed is char. Uses loc to perform the character encoding conversion. If value_type is wchar_t, converts from to wide using the std::codecvt<wchar_t, char, std::mbstate_t> facet of loc. Otherwise, first converts to wide using the std::codecvt<wchar_t, char, std::mbstate_t> facet and then converts to filesystem native character type using std::codecvt<wchar_t,value_type> facet of loc. 😭 (yes that sentence is a marathon, i don't make the rules)
(5) and (7) participate in overload resolution only if Source and path are not the same type, and either: - Source is a specialization of std::basic_string or std::basic_string_view, or - std::iterator_traits<std::decay_t<Source>>::value_type is valid and denotes a possibly const-qualified encoding character type (char, char8_t (since C++20), char16_t, char32_t, or wchar_t).

πŸ’œ Parameters πŸ’œ

  • p β€” a path to copy
  • source β€” std::basic_string, std::basic_string_view, pointer to a null-terminated character string, or input iterator with a character value type that points to a null-terminated character sequence (the character type must be char for overload (7))
  • first, last β€” pair of LegacyInputIterators that specify a character sequence
  • fmt β€” enumerator of type path::format which specifies how pathname format is to be interpreted
  • loc β€” locale that defines encoding conversion to use

πŸŽ€ Type requirements πŸŽ€

  • InputIt must meet the requirements of LegacyInputIterator.
  • The value type of InputIt must be one of the character types char, wchar_t, char8_t (since C++20), char16_t and char32_t to use the overload (6).
  • The value type of InputIt must be char to use the overload (8).

πŸ”₯ Exceptions πŸ”₯

2, 4–8) May throw implementation-defined exceptions. (not me warning you twice πŸ’€)


🌈 Notes 🌈

For portable pathname generation from Unicode strings, see u8path. (until C++20)

(since C++20) the path constructor supports creation from UTF-8 string when the source is a sequence of char8_t. slay ✨


πŸ‘‘ Example πŸ‘‘

// Run this code

#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;

int main()
{
    fs::path p1 = "/usr/lib/sendmail.cf"; // portable format
    fs::path p2 = "C:\\users\\abcdef\\AppData\\Local\\Temp\\"; // native format
    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';
}

✨ Output ✨

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

look at those paths go 😭🫢 so clean.


πŸ¦‹ Defect reports πŸ¦‹

The following behavior-changing defect reports were applied retroactively to previously published C++ standards. (yes, they literally went back in time to fix stuff β€” main character energy πŸ‘‘)

  • LWG 3244 β€” applied to C++17 β€” behavior as published: constraint that Source cannot be path was missing β†’ correct behavior: constraint that Source cannot be path was added βœ…

πŸ’« See also πŸ’«

  • u8path β€” creates a path from a UTF-8 encoded source (C++17) (deprecated in C++20) (function)

and that's the whole page, bestie β€” you ate that πŸ“πŸ’…

source + version: http://cppreference.com, dated 2024.06.10 β€” go forth and construct paths, ily πŸ’–

πŸ“¦ where this page comes from