プログラミング/C++/C++11 既存ライブラリ変更点/入出力 の変更点


C++03規格時点で存在した入出力ライブラリに対するC++11規格での変更点をまとめています。

#contents

*概要 [#about]

当文書では、入出力(ストリーム)に関する機能を提供するヘッダファイル群について、C++11規格での変更点をまとめている。

他の多くの標準ライブラリ定義クラスと異なり、ほとんどの入出力クラスには継承関係が存在する。~
クラス間の継承ツリーについては下記ページ冒頭の図を参照のこと。

-[[Input/Output - C++ Reference>http://www.cplusplus.com/reference/iolibrary/]]

基本的に、親クラスにおける変更点はその派生先となる子孫クラスにも引き継がれる。~
そのため当文書では、ヘッダファイルをアルファベット順ではなく継承ツリーのルート側から順に並べている。

*<ios> [#ios]

**ios_base クラス [#ios-ios_base]

-~コピーコンストラクタおよびコピー代入演算子が private 宣言から public の delete 指定になった。

***ios_base::failure クラス [#ios-ios_base-failure]

-~継承元クラスが @code{exception}; から @code{system_error}; に変更された。
-~コンストラクタの定義が変更された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++03
explicit failure(const string& msg);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// C++11
explicit failure(const string& msg, const error_code& err_code = io_errc::stream);
explicit failure(const char* msg, const error_code& err_code = io_errc::stream);
}}
-~デストラクタとメンバ関数 @code{what}; のオーバライド定義が削除された。

**basic_ios クラステンプレート [#ios-basic_ios]

[[@code{ios_base}; クラス>#ios-ios_base]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// bool 型への明示的型変換。(C++11規格により if 文などでは暗黙の型変換が行われる。)
// エラーフラグが1つもセットされていなければ true を、そうでなければ false を返す。
explicit operator bool() const;
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// src の内容を自身にムーブする。
protected: void move(basic_ios& src);
protected: void move(basic_ios&& src);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_ios 間で内容を入れ替える。
protected: void swap(basic_ios& other) noexcept;
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// ストリームバッファを設定する。
protected: void set_rdbuf(basic_streambuf<char_type, traits_type>* buf);
}}
-~コピーコンストラクタおよびコピー代入演算子が delete 指定で定義された。
-~メンバ関数 @code{operator void*}; が削除された。(メンバ関数 @code{operator bool}; が同等の役割を引き継ぐ)

**<ios> その他 [#ios-others]

-~列挙クラス型 @code{io_errc}; が定義された。
-~下記のフリー関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// iostream 関連のエラーコードカテゴリを表す値を取得する。
// system_error 派生クラス型変数 e について e.code().category() との比較に用いる。
const error_category& iostream_category();
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 実数型の文字列フォーマットに16進数浮動小数点を用いるようにするマニピュレータ。
// cout << hexfloat << 0.1; などのように用いる。
ios_base& hexfloat(ios_base& s);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 実数型の文字列フォーマットを既定の設定に戻すマニピュレータ。
// cout << defaultfloat << 0.1; などのように用いる。
ios_base& defaultfloat(ios_base& s);
}}
-~@code{streamoff}; 型の定義が変更された。
--C++03:処理系依存の型。
--C++11:システムがサポートする最大ファイルサイズを表現可能な符号付き整数型。(通常は @code{long long}; )

*<istream> [#istream]

**basic_istream クラステンプレート [#istream-basic_istream]

[[@code{basic_ios}; クラステンプレート>#ios-basic_ios]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_istream 間で内容を入れ替える。
void swap(basic_istream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_istream& operator=(const basic_istream&) = delete;
basic_istream& operator=(basic_istream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_istream(const basic_istream&) = delete;
protected: basic_istream(basic_istream&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_istream& operator>>(long long& value);
basic_istream& operator>>(unsigned long long& value);
}}
-~メンバ関数 @code{putback}; 、 @code{unget}; 、 @code{seekg}; 呼び出し時に @code{eofbit}; フラグがセットされていた場合の動作が変更された。
--C++03:処理に失敗する。 @code{failbit}; フラグのセットのみを行う。
--C++11: @code{eofbit}; フラグをクリアし、通常通りの処理を行う。

***basic_istream::sentry クラス [#istream-basic_istream-sentry]

-~コピーコンストラクタおよびコピー代入演算子が private 宣言から public の delete 指定になった。
-~@code{bool}; 型への型変換メンバ関数に @code{explicit}; が付けられ、暗黙の型変換が抑止された。

**basic_iostream クラステンプレート [#istream-basic_iostream]

[[@code{basic_istream}; クラステンプレート>#istream-basic_istream]]および [[@code{basic_ostream}; クラステンプレート>#ostream-basic_ostream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_iostream 間で内容を入れ替える。
void swap(basic_iostream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_iostream& operator=(const basic_iostream&) = delete;
basic_iostream& operator=(basic_iostream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_iostream(const basic_iostream&) = delete;
protected: basic_iostream(basic_iostream&& src);
}}
-~多重継承で定義が曖昧だった下記のメンバ型が明示的に定義された。
--@code{char_type};
--@code{traits_type};
--@code{int_type};
--@code{pos_type};
--@code{off_type};

**<istream> その他 [#istream-others]

-~下記のフリー関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class CharT, class Traits, class T>
basic_istream<CharT, Traits>& operator>>(basic_istream<CharT, Traits>&& s, T& value);
}}

*<ostream> [#ostream]

**basic_ostream クラステンプレート [#ostream-basic_ostream]

[[@code{basic_ios}; クラステンプレート>#ios-basic_ios]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_ostream 間で内容を入れ替える。
void swap(basic_ostream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_ostream& operator=(const basic_ostream&) = delete;
basic_ostream& operator=(basic_ostream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_ostream(const basic_ostream&) = delete;
protected: basic_ostream(basic_ostream&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_ostream& operator<<(long long value);
basic_ostream& operator<<(unsigned long long value);
}}

***basic_ostream::sentry クラス [#ostream-basic_ostream-sentry]

-~コピーコンストラクタおよびコピー代入演算子が private 宣言から public の delete 指定になった。
-~@code{bool}; 型への型変換メンバ関数に @code{explicit}; が付けられ、暗黙の型変換が抑止された。

**<ostream> その他 [#ostream-others]

-~下記のフリー関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class CharT, class Traits, class T>
basic_ostream<CharT, Traits>& operator<<(
    basic_ostream<CharT, Traits>&& s,
    const T& value);
}}

*<streambuf> [#streambuf]

**basic_streambuf クラステンプレート [#streambuf-basic_streambuf]

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_streambuf 間で内容を入れ替える。
protected: void swap(basic_streambuf& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。
protected: basic_streambuf& operator=(const basic_streambuf& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
protected: basic_streambuf(const basic_streambuf&);
}}

*<iostream> [#iostream]

-~<iostream> 内で下記のヘッダファイルがインクルードされることが明示された。
--[[&lt;ios&gt;>#ios]]
--[[&lt;istream&gt;>#istream]]
--[[&lt;ostream&gt;>#ostream]]
--[[&lt;streambuf&gt;>#streambuf]]
--[[&lt;iosfwd&gt;>#iosfwd]]

*<fstream> [#fstream]

**basic_ifstream クラステンプレート [#fstream-basic_ifstream]

[[@code{basic_istream}; クラステンプレート>#istream-basic_istream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_ifstream 間で内容を入れ替える。
void swap(basic_ifstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_ifstream& operator=(const basic_ifstream&) = delete;
basic_ifstream& operator=(basic_ifstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
explicit basic_ifstream(const string& path, ios_base::openmode mode = ios_base::in);
basic_ifstream(const basic_ifstream&) = delete;
basic_ifstream(basic_ifstream&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
void open(const string& path, ios_base::openmode mode = ios_base::in);
}}
-~メンバ関数 @code{is_open}; の定義が変更され、 @code{const}; 修飾された。

**basic_ofstream クラステンプレート [#fstream-basic_ofstream]

[[@code{basic_ostream}; クラステンプレート>#ostream-basic_ostream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_ofstream 間で内容を入れ替える。
void swap(basic_ofstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_ofstream& operator=(const basic_ofstream&) = delete;
basic_ofstream& operator=(basic_ofstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
explicit basic_ofstream(const string& path, ios_base::openmode mode = ios_base::out);
basic_ofstream(const basic_ofstream&) = delete;
basic_ofstream(basic_ofstream&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
void open(const string& path, ios_base::openmode mode = ios_base::out);
}}
-~メンバ関数 @code{is_open}; の定義が変更され、 @code{const}; 修飾された。

**basic_fstream クラステンプレート [#fstream-basic_fstream]

[[@code{basic_iostream}; クラステンプレート>#istream-basic_iostream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_fstream 間で内容を入れ替える。
void swap(basic_fstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_fstream& operator=(const basic_fstream&) = delete;
basic_fstream& operator=(basic_fstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
explicit basic_fstream(
    const string& path,
    ios_base::openmode mode = ios_base::in | ios_base::out);
basic_fstream(const basic_fstream&) = delete;
basic_fstream(basic_fstream&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
void open(
    const string& path,
    ios_base::openmode mode = ios_base::in | ios_base::out);
}}
-~メンバ関数 @code{is_open}; の定義が変更され、 @code{const}; 修飾された。

**basic_filebuf クラステンプレート [#fstream-basic_filebuf]

[[@code{basic_streambuf}; クラステンプレート>#streambuf-basic_streambuf]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_filebuf 間で内容を入れ替える。
void swap(basic_filebuf& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_filebuf& operator=(const basic_filebuf&) = delete;
basic_filebuf& operator=(basic_filebuf&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_filebuf(const basic_filebuf&) = delete;
basic_filebuf(basic_filebuf&& src);
}}
-~下記のメンバ関数オーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
void open(const string& path, ios_base::openmode mode);
}}

**<fstream> その他 [#fstream-others]

-~フリー関数 @code{swap}; ([[&lt;utility&gt;>../ユーティリティ#utility]])のオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class CharT, class Traits>
void swap(basic_ifstream<CharT, Traits>& a, basic_ifstream<CharT, Traits>& b);
template<class CharT, class Traits>
void swap(basic_ofstream<CharT, Traits>& a, basic_ofstream<CharT, Traits>& b);
template<class CharT, class Traits>
void swap(basic_fstream<CharT, Traits>& a, basic_fstream<CharT, Traits>& b);
template<class CharT, class Traits>
void swap(basic_filebuf<CharT, Traits>& a, basic_filebuf<CharT, Traits>& b);
}}

*<sstream> [#sstream]

**basic_istringstream クラステンプレート [#sstream-basic_istringstream]

[[@code{basic_istream}; クラステンプレート>#istream-basic_istream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_istringstream 間で内容を入れ替える。
void swap(basic_istringstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_istringstream& operator=(const basic_istringstream&) = delete;
basic_istringstream& operator=(basic_istringstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_istringstream(const basic_istringstream&) = delete;
basic_istringstream(basic_istringstream&& src);
}}

**basic_ostringstream クラステンプレート [#sstream-basic_ostringstream]

[[@code{basic_ostream}; クラステンプレート>#ostream-basic_ostream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_ostringstream 間で内容を入れ替える。
void swap(basic_ostringstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_ostringstream& operator=(const basic_ostringstream&) = delete;
basic_ostringstream& operator=(basic_ostringstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_ostringstream(const basic_ostringstream&) = delete;
basic_ostringstream(basic_ostringstream&& src);
}}

**basic_stringstream クラステンプレート [#sstream-basic_stringstream]

[[@code{basic_iostream}; クラステンプレート>#istream-basic_iostream]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_stringstream 間で内容を入れ替える。
void swap(basic_stringstream& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_stringstream& operator=(const basic_stringstream&) = delete;
basic_stringstream& operator=(basic_stringstream&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_stringstream(const basic_stringstream&) = delete;
basic_stringstream(basic_stringstream&& src);
}}

**basic_stringbuf クラステンプレート [#sstream-basic_stringbuf]

[[@code{basic_streambuf}; クラステンプレート>#streambuf-basic_streambuf]]を継承しており、それらの変更点も引き継ぐ。

-~下記のメンバ関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 2つの basic_stringbuf 間で内容を入れ替える。
void swap(basic_stringbuf& other);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 代入演算子。コピーはできないがムーブは可能。
basic_stringbuf& operator=(const basic_stringbuf&) = delete;
basic_stringbuf& operator=(basic_stringbuf&& src);
}}
-~下記のコンストラクタオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
basic_stringbuf(const basic_stringbuf&) = delete;
basic_stringbuf(basic_stringbuf&& src);
}}

**<sstream> その他 [#sstream-others]

-~フリー関数 @code{swap}; ([[&lt;utility&gt;>../ユーティリティ#utility]])のオーバロードが定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<class CharT, class Traits, class Alloc> void swap(
    basic_istringstream<CharT, Traits, Alloc>& a,
    basic_istringstream<CharT, Traits, Alloc>& b);
template<class CharT, class Traits, class Alloc> void swap(
    basic_ostringstream<CharT, Traits, Alloc>& a,
    basic_ostringstream<CharT, Traits, Alloc>& b);
template<class CharT, class Traits, class Alloc> void swap(
    basic_stringstream<CharT, Traits, Alloc>& a,
    basic_stringstream<CharT, Traits, Alloc>& b);
template<class CharT, class Traits, class Alloc> void swap(
    basic_stringbuf<CharT, Traits, Alloc>& a,
    basic_stringbuf<CharT, Traits, Alloc>& b);
}}

*<iomanip> [#iomanip]

文中で型名が @code{unspecified}; となっているものは処理系依存の型であることを表す。

-~下記の関数が定義された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 通貨フォーマットの入力を受け取るマニピュレータ。
// intl が true ならば国際通貨文字列フォーマット("USD", "JPY" 等)を要求する。
// double value; cin >> get_money(value); などのように用いる。
template<class MoneyT>
unspecified get_money(MoneyT& value, bool intl = false);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 通貨フォーマットでの出力を行うマニピュレータ。
// intl が true ならば国際通貨文字列フォーマットで出力する。
// cout << put_money(100); などのように用いる。
template<class MoneyT>
unspecified put_money(const MoneyT& value, bool intl = false);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 時刻フォーマットの入力を受け取るマニピュレータ。
// tm value; cin >> get_time(&value, "%Y/%m/%d %H:%M:%S"); などのように用いる。
template<class CharT>
unspecified get_time(tm* value, const CharT* format);
}}
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
// 時刻フォーマットでの出力を行うマニピュレータ。
// extern tm value; cout << put_time(&value, "%Y/%m/%d"); などのように用いる。
template<class CharT>
unspecified put_time(const tm* value, const CharT* format);
}}

*<iosfwd> [#iosfwd]

-~下記の前方宣言が追加された。
#code(c,nomenu,nonumber,nooutline,noliteral,nocomment){{
template<> class char_traits<char16_t>;
template<> class char_traits<char32_t>;
}}