30 Input/output library [input.output]

30.3 Forward declarations [iostream.forward]

30.3.1 Header <iosfwd> synopsis [iosfwd.syn]

namespace std {
  template<class charT> class char_traits;
  template<> class char_traits<char>;
  template<> class char_traits<char16_t>;
  template<> class char_traits<char32_t>;
  template<> class char_traits<wchar_t>;

  template<class T> class allocator;

  template <class charT, class traits = char_traits<charT>>
    class basic_ios;
  template <class charT, class traits = char_traits<charT>>
    class basic_streambuf;
  template <class charT, class traits = char_traits<charT>>
    class basic_istream;
  template <class charT, class traits = char_traits<charT>>
    class basic_ostream;
  template <class charT, class traits = char_traits<charT>>
    class basic_iostream;

  template <class charT, class traits = char_traits<charT>,
      class Allocator = allocator<charT>>
    class basic_stringbuf;
  template <class charT, class traits = char_traits<charT>,
      class Allocator = allocator<charT>>
    class basic_istringstream;
  template <class charT, class traits = char_traits<charT>,
      class Allocator = allocator<charT>>
    class basic_ostringstream;
  template <class charT, class traits = char_traits<charT>,
      class Allocator = allocator<charT>>
    class basic_stringstream;

  template <class charT, class traits = char_traits<charT>>
    class basic_filebuf;
  template <class charT, class traits = char_traits<charT>>
    class basic_ifstream;
  template <class charT, class traits = char_traits<charT>>
    class basic_ofstream;
  template <class charT, class traits = char_traits<charT>>
    class basic_fstream;

  template <class charT, class traits = char_traits<charT>>
    class istreambuf_iterator;
  template <class charT, class traits = char_traits<charT>>
    class ostreambuf_iterator;

  using ios  = basic_ios<char>;
  using wios = basic_ios<wchar_t>;

  using streambuf = basic_streambuf<char>;
  using istream   = basic_istream<char>;
  using ostream   = basic_ostream<char>;
  using iostream  = basic_iostream<char>;

  using stringbuf     = basic_stringbuf<char>;
  using istringstream = basic_istringstream<char>;
  using ostringstream = basic_ostringstream<char>;
  using stringstream  = basic_stringstream<char>;

  using filebuf  = basic_filebuf<char>;
  using ifstream = basic_ifstream<char>;
  using ofstream = basic_ofstream<char>;
  using fstream  = basic_fstream<char>;

  using wstreambuf = basic_streambuf<wchar_t>;
  using wistream   = basic_istream<wchar_t>;
  using wostream   = basic_ostream<wchar_t>;
  using wiostream  = basic_iostream<wchar_t>;

  using wstringbuf     = basic_stringbuf<wchar_t>;
  using wistringstream = basic_istringstream<wchar_t>;
  using wostringstream = basic_ostringstream<wchar_t>;
  using wstringstream  = basic_stringstream<wchar_t>;

  using wfilebuf  = basic_filebuf<wchar_t>;
  using wifstream = basic_ifstream<wchar_t>;
  using wofstream = basic_ofstream<wchar_t>;
  using wfstream  = basic_fstream<wchar_t>;

  template <class state> class fpos;
  using streampos  = fpos<char_traits<char>::state_type>;
  using wstreampos = fpos<char_traits<wchar_t>::state_type>;
}

Аргументы шаблона по умолчанию описаны как появляющиеся как<iosfwd> в синопсисе других заголовков, так и в их синопсисе, но он хорошо сформирован, чтобы включать оба <iosfwd> и один или несколько других заголовков.287

Реализация отвечает за реализацию заголовков, чтобы включение <iosfwd> и другие заголовки не нарушали правила о множественном появлении аргументов по умолчанию.

30.3.2 Overview [iostream.forward.overview]

Шаблон класса специализация basic_­ios<charT, traits> служит в качестве виртуального базового класса для шаблонов классов basic_­istream, basic_­ostreamи шаблоны классов , полученных из них. basic_­iostream - это шаблон класса, производный от обоих basic_­istream<charT, traits> и basic_­ostream<charT, traits>.

Специализация шаблона класса basic_­streambuf<charT, traits> служит базовым классом для шаблонов классов basic_­stringbuf и basic_­filebuf.

Специализация шаблона класса basic_­istream<charT, traits> служит базовым классом для шаблонов классов basic_­istringstream и basic_­ifstream.

Специализация шаблона класса basic_­ostream<charT, traits> служит базовым классом для шаблонов классов basic_­ostringstream и basic_­ofstream.

Специализация шаблона класса basic_­iostream<charT, traits> служит базовым классом для шаблонов классов basic_­stringstream и basic_­fstream.

Другие typedef-names определяют экземпляры шаблонов классов, специализированных для типовchar или wchar_­t.

Специализации шаблона класса fpos используются для указания информации о положении файла.

Типы streampos и wstreampos используются для позиционирования потоков, специализирующихся на char и wchar_­t соответственно.

[ Note: Этот синопсис предполагает замкнутость между streampos и char_­traits<char>. Реализация может избежать этой замкнутости путем замены эквивалентных типов. Один из способов сделать это может быть

template<class stateT> class fpos { ... };      // depends on nothing
using _STATE = ... ;             // implementation private declaration of stateT

using streampos = fpos<_STATE>;

template<> struct char_traits<char> {
  using pos_type = streampos;
}

end note]