namespace std {
  template<class charT, class traits = char_traits<charT>>
  class basic_ifstream : public basic_istream<charT, traits> {
  public:
    using char_type   = charT;
    using int_type    = typename traits::int_type;
    using pos_type    = typename traits::pos_type;
    using off_type    = typename traits::off_type;
    using traits_type = traits;
        basic_ifstream();
    explicit basic_ifstream(const char* s,
                            ios_base::openmode mode = ios_base::in);
    explicit basic_ifstream(const filesystem::path::value_type* s,
                            ios_base::openmode mode = ios_base::in);      explicit basic_ifstream(const string& s,
                            ios_base::openmode mode = ios_base::in);
    explicit basic_ifstream(const filesystem::path& s,
                            ios_base::openmode mode = ios_base::in);
    basic_ifstream(const basic_ifstream& rhs) = delete;
    basic_ifstream(basic_ifstream&& rhs);
        basic_ifstream& operator=(const basic_ifstream& rhs) = delete;
    basic_ifstream& operator=(basic_ifstream&& rhs);
    void swap(basic_ifstream& rhs);
        basic_filebuf<charT, traits>* rdbuf() const;
    bool is_open() const;
    void open(const char* s, ios_base::openmode mode = ios_base::in);
    void open(const filesystem::path::value_type* s,
              ios_base::openmode mode = ios_base::in);      void open(const string& s, ios_base::openmode mode = ios_base::in);
    void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in);
    void close();
  private:
    basic_filebuf<charT, traits> sb;   };
  template<class charT, class traits>
    void swap(basic_ifstream<charT, traits>& x,
              basic_ifstream<charT, traits>& y);
}The class
basic_ifstream<charT, traits>
supports reading from named files
.It uses a
basic_filebuf<charT, traits>
object to control the associated
sequence
.For the sake of exposition, the maintained data is presented here as:
Effects: 
Constructs an object of class
basic_ifstream<charT, traits>,
initializing the base class with
basic_istream<charT, traits>(&sb) (
[istream.cons])
and initializing 
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons])
. explicit basic_ifstream(const char* s,
                        ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path::value_type* s,
                        ios_base::openmode mode = ios_base::in);  Effects: 
Constructs an object of class
basic_ifstream<charT, traits>,
initializing the base class with
basic_istream<charT, traits>(&sb) (
[istream.cons])
and initializing 
sb with
basic_filebuf<charT, traits>() (
[filebuf.cons]),
then calls
rdbuf()->open(s, mode | ios_base::in).  If that function returns a null pointer, calls
setstate(failbit).explicit basic_ifstream(const string& s,
                        ios_base::openmode mode = ios_base::in);
explicit basic_ifstream(const filesystem::path& s,
                        ios_base::openmode mode = ios_base::in);
Effects: The same as 
basic_ifstream(s.c_str(), mode). basic_ifstream(basic_ifstream&& rhs);
Effects: Move constructs from the rvalue 
rhs.  This
is accomplished by move constructing the base class, and the contained
basic_filebuf.Next
basic_istream<charT, traits>::set_rdbuf(&sb) is called to install
the contained 
basic_filebuf.basic_ifstream& operator=(basic_ifstream&& rhs);
Effects: Move assigns the base and members of 
*this from the base and corresponding
members of 
rhs. void swap(basic_ifstream& rhs);
Effects: Exchanges the state of 
*this
and 
rhs by calling
basic_istream<charT, traits>::swap(rhs) and
sb.swap(rhs.sb). template<class charT, class traits>
  void swap(basic_ifstream<charT, traits>& x,
            basic_ifstream<charT, traits>& y);
Effects: As if by 
x.swap(y). basic_filebuf<charT, traits>* rdbuf() const;
Returns: 
const_cast<basic_filebuf<charT, traits>*>(&sb). Returns: 
rdbuf()->is_open(). void open(const char* s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path::value_type* s,
          ios_base::openmode mode = ios_base::in);  Effects: 
Calls
rdbuf()->open(s, mode | ios_base::in).  If that function does not return a null pointer
calls 
clear(),
otherwise calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.void open(const string& s, ios_base::openmode mode = ios_base::in);
void open(const filesystem::path& s, ios_base::openmode mode = ios_base::in);
Effects: Calls 
open(s.c_str(), mode). Effects: 
Calls
rdbuf()->close()
and, if that function returns
a null pointer,
calls
setstate(failbit)
(which may throw
ios_base::failure) (
[iostate.flags])
.