NAME

operator<<,>>(std::filesystem::path) - operator<<,>>(std::filesystem::path)

Synopsis


template< class CharT, class Traits >
std::basic_ostream<CharT,Traits>& (1) (since C++17)
operator<<( std::basic_ostream<CharT,Traits>& os, const std::filesystem::path& p );
template< class CharT, class Traits >
std::basic_istream<CharT,Traits>& (2) (since C++17)
operator>>( std::basic_istream<CharT,Traits>& is, std::filesystem::path& p );


Performs stream input or output on the path p. std::quoted is used so that spaces do not cause truncation when later read by stream input operator.
These function templates are not visible to ordinary unqualified or qualified_lookup , and can only be found by argument-dependent_lookup when std::filesystem::path is an associated class of the arguments. This prevents undesirable conversions in the presence of a using namespace std::filesystem; using-directive.

Parameters


os - stream to perform output on
is - stream to perform input on
p - path to insert or extract

Return value


1) os
2) is

Exceptions


(none)


Defect reports


The following behavior-changing defect reports were applied retroactively to previously published C++ standards.


DR Applied to Behavior as published Correct behavior
LWG_2989 C++17 allowed insertion of everything convertible to path in the presence of a using-directive made hidden friend

Possible implementation

First version


  template< class CharT, class Traits >
  std::basic_ostream<CharT,Traits>&
      operator<<( std::basic_ostream<CharT,Traits>& os, const path& p )
  {
      os << std::quoted(p.string<CharT,Traits>());
      return os;
  }

Second version


  template< class CharT, class Traits >
  std::basic_istream<CharT,Traits>&
      operator>>( std::basic_istream<CharT,Traits>& is, path& p )
  {
      std::basic_string<CharT, Traits> t;
      is >> std::quoted(t);
      p = t;
      return is;
  }

Example


// Run this code


  #include <iostream>
  #include <filesystem>
  int main()
  {
   std::cout << std::filesystem::current_path() << '\n';

  }

Possible output:


  "/home/user"