std::basic_ostream<CharT,Traits>::operator<<
From cppreference.com
< cpp | io | basic_ostream
| basic_ostream& operator<<( bool value ); |
(1) | |
basic_ostream& operator<<( long value ); |
(2) | |
| basic_ostream& operator<<( unsigned long value ); |
(3) | |
| basic_ostream& operator<<( long long value ); |
(4) | (C++11以降) |
| basic_ostream& operator<<( unsigned long long value ); |
(5) | (C++11以降) |
| basic_ostream& operator<<( double value ); |
(6) | |
| basic_ostream& operator<<( long double value ); |
(7) | |
basic_ostream& operator<<( const void* value ); |
(8) | |
| basic_ostream& operator<<( const volatile void* value ); |
(9) | (C++23から) |
| basic_ostream& operator<<( std::nullptr_t ); |
(10) | (C++17以降) |
basic_ostream& operator<<( short value ); |
(11) | |
| basic_ostream& operator<<( int value ); |
(12) | |
| basic_ostream& operator<<( unsigned short value ); |
(13) | |
| basic_ostream& operator<<( unsigned int value ); |
(14) | |
| basic_ostream& operator<<( float value ); |
(15) | |
| basic_ostream& operator<<( /* extended-floating-point-type */ value ); |
(16) | (C++23から) |
| basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb ); |
(17) | |
basic_ostream& operator<<( std::ios_base& (*func)(std::ios_base&) ); |
(18) | |
| basic_ostream& operator<<( std::basic_ios<CharT, Traits>& (*func)(std::basic_ios<CharT, Traits>&) ); |
(19) | |
| basic_ostream& operator<<( std::basic_ostream<CharT, Traits>& (*func) |
(20) | |
ストリームにデータを挿入する。
1-8) value を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、std::num_put::put() を呼び出して値を挿入する。出力中にファイル終端条件に遭遇した場合 (put().failed() == true)、
badbit を設定する。9) return operator<<(const_cast<const void*>(p)); と等価。
10) return *this << s; と等価。ここで s は実装定義の null 終端文字型文字列である。
11) short value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(2) と同じように long 型の lval を挿入する。ここで lval は、
- flags() & std::ios_base::basefield が std::ios_base::oct または std::ios_base::hex の場合、static_cast<long>(static_cast<unsigned short>(value))、それ以外の場合は
- static_cast<long>(value) である。
12) int value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(2) と同じように long 型の lval を挿入する。ここで lval は、
- flags() & std::ios_base::basefield が std::ios_base::oct または std::ios_base::hex の場合、static_cast<long>(static_cast<unsigned int>(value))、それ以外の場合は
- static_cast<long>(value) である。
13,14) unsigned short または unsigned int value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(3) と同じように static_cast<unsigned long>(value) を挿入する。
15) float value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(6) と同じように static_cast<double>(value) を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、/* extended-floating-point-type */ の 浮動小数点変換ランクをチェックする。
- ランクが double のランク以下の場合、(6) と同じように static_cast<double>(value) を挿入する。
- それ以外の場合、ランクが long double のランク以下の場合、(7) と同じように static_cast<long double>(value) を挿入する。
- それ以外の場合、このオーバーロードの呼び出しは、実装定義のセマンティクスで条件付きでサポートされる。
17) この関数は UnformattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、sb がヌルポインタであるかどうかをチェックする。ヌルポインタの場合、setstate(badbit) を実行して終了する。それ以外の場合、次のいずれかの条件が満たされるまで、sb が制御する入力シーケンスから文字を抽出し、*this に挿入する。
- 入力シーケンスでファイル終端が発生する。
- 出力シーケンスへの挿入が失敗する (この場合、挿入される文字は抽出されない)。
- 例外が発生する (この場合、例外は捕捉される)。
failbit を設定し、exceptions() で failbit が設定されている場合、例外を再スローする。目次 |
[編集] パラメータ
| value | - | 挿入する整数、浮動小数点、ブール値、またはポインタ値 |
| func | - | 呼び出す関数 |
| sb | - | データを読み込むストリームバッファへのポインタ |
[編集] 戻り値
1-19) *this
20) func(*this)
[編集] 備考
非静的メンバへのポインタ、volatile なオブジェクトへのポインタ、(C++23 まで)、または関数ポインタ((18-20) のオーバーロードが受け入れるシグネチャを持つもの以外)のオーバーロードはない。
- そのようなオブジェクトを出力しようとすると、bool への暗黙的な変換が呼び出され、非ヌルポインタ値の場合は 1 が出力される(
boolalphaが設定されている場合は true が出力される)。
文字および文字列引数(例えば、char または const char* 型)は、operator<< の非メンバオーバーロードによって処理される。
- メンバ関数呼び出し構文を使用して文字を出力しようとすると(例:std::cout.operator<<('c');)、(2-5) または (11-14) のいずれかのオーバーロードが呼び出され、数値が出力される。
- メンバ関数呼び出し構文を使用して文字列を出力しようとすると、オーバーロード (8) が呼び出され、代わりにポインタ値が出力される。
オーバーロード (10) は LWG issue 2221 の解決によって追加されたが、C++11/14 モードのどの標準ライブラリ実装でも実装されていない。
[編集] 例
このコードを実行
#include <iomanip> #include <iostream> #include <sstream> int fun() { return 42; } int main() { std::istringstream input(" \"Some text.\" "); double f = 3.14; bool b = true; std::cout << fun() // int overload (12) << ' ' // non-member overload << std::boolalpha // function overload (18) << b // bool overload (1) << " " // non-member overload << std::fixed // function overload (18) again << f // double overload (6) << input.rdbuf() // streambuf overload << fun // bool overload (1): there's no overload for int(*)() << std::endl; // function overload (18) again int x = 0; int* p1 = &x; volatile int* p2 = &x; std::cout << "p1: " << p1 << '\n' // `const void*` overload, prints address << "p2: " << p2 << '\n'; // before C++23 (P1147): bool overload :), because // operator<<(const void*) is not a match, as it discards the `volatile` // qualifier. To fix this, C++23 adds `const volatile void*` overload (9), // that prints the address as expected. }
実行結果の例
42 true 3.140000 "Some text." true p1: 0x7ffcea766600 p2: 0x7ffcea766600
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 117 | C++98 | オーバーロード (1-8,11-15) は挿入を num_put::put に委譲したが、short、 unsigned short、int、unsigned int、および float のオーバーロードがないため、 |
それらは渡される前にnum_put::put に変換される。LWG 567 |
| オーバーロード (17) は FormattedOutputFunction として動作していた。 | C++98 | LWG issue 60 の解決により、 それは |
として動作する。 UnformattedOutputFunction |
[編集] 関連項目
| 文字データを挿入する、または右辺値ストリームに挿入する (function template) | |
| 文字列に対するストリーム入出力を実行する (function template) | |
| (C++17) |
string viewのストリーム出力を行う (function template) |
| ビットセットのストリーム入出力を実行する (function template) | |
| 複素数をシリアライズ・デシリアライズする (関数テンプレート) | |
| (C++11) |
疑似乱数エンジンのストリーム入出力を実行 (関数テンプレート) |
| (C++11) |
疑似乱数分布のストリーム入出力を実行 (関数テンプレート) |
| 文字を挿入する (public member function) | |
| 文字ブロックを挿入する (public member function) | |
| (C++17) |
整数値または浮動小数点数値を文字シーケンスに変換する (関数) |