名前空間
変種
操作

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)

        (std::basic_ostream<CharT, Traits>&) );
(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 は、
12) int value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(2) と同じように long 型の lval を挿入する。ここで lval は、
13,14) unsigned short または unsigned int value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(3) と同じように static_cast<unsigned long>(value) を挿入する。
15) float value から値を挿入する。
この関数は FormattedOutputFunction として動作する。セントリーオブジェクトを構築してチェックした後、(6) と同じように static_cast<double>(value) を挿入する。
16) value から値を挿入する。ライブラリは、パラメータ値の型として、すべての cv-unqualified な 拡張浮動小数点型のオーバーロードを提供する。
この関数は 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 に挿入する。
  • 入力シーケンスでファイル終端が発生する。
  • 出力シーケンスへの挿入が失敗する (この場合、挿入される文字は抽出されない)。
  • 例外が発生する (この場合、例外は捕捉される)。
文字が挿入されなかった場合、setstate(failbit) を実行する。抽出中に例外がスローされた場合、failbit を設定し、exceptions()failbit が設定されている場合、例外を再スローする。
18-20) func(*this) を呼び出す。これらのオーバーロードは、std::endl などの出力 I/O マニピュレータを実装するために使用される。

目次

[編集] パラメータ

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 shortintunsigned int、および float のオーバーロードがないため、
それらは渡される前に
num_put::put に変換される。
LWG 567
オーバーロード (17)FormattedOutputFunction として動作していた。 C++98 LWG issue 60 の解決により、
それは
として動作する。
UnformattedOutputFunction

[編集] 関連項目

文字データを挿入する、または右辺値ストリームに挿入する
(function template) [編集]
文字列に対するストリーム入出力を実行する
(function template) [編集]
string viewのストリーム出力を行う
(function template) [編集]
ビットセットのストリーム入出力を実行する
(function template) [編集]
複素数をシリアライズ・デシリアライズする
(関数テンプレート) [編集]
疑似乱数エンジンのストリーム入出力を実行
(関数テンプレート) [編集]
疑似乱数分布のストリーム入出力を実行
(関数テンプレート) [編集]
文字を挿入する
(public member function) [編集]
文字ブロックを挿入する
(public member function) [編集]
(C++17)
整数値または浮動小数点数値を文字シーケンスに変換する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)