Namespaces
Variants

std::basic_ostream<CharT,Traits>:: operator<<

From cppreference.net
**翻訳結果:** **注記:** このコードはC++の関数宣言であり、HTMLタグ内のコード部分は翻訳対象外のため、元のまま保持されています。数値の(17)も文脈上、バージョン番号や項目番号を示すものと判断し、翻訳していません。 **翻訳結果:** **注記:** このC++コード断片は関数宣言の一部であり、HTMLタグ内のコード部分は翻訳対象外のため、元のまま保持されています。数値の(19)のみが翻訳可能なテキストですが、これはバージョン番号や識別子として機能しているため、翻訳せずにそのまま残すのが適切です。 **翻訳結果:** HTMLタグ、属性、` `、`
`、``タグ内のテキスト、およびC++固有の用語は翻訳せず、元のフォーマットを保持しました。
(注:このHTML要素には翻訳対象のテキストコンテンツが含まれていないため、元の構造をそのまま保持しています)
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:: 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_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() を呼び出して値を挿入する。出力中にEOF状態が発生した場合( put ( ) . failed ( ) == true )、 badbit を設定する。
9) 次と同等: return operator << ( const_cast < const void * > ( p ) ) ;
10) 次と同等: return * this << s ; 。ここで s は実装定義のナル終端文字型文字列。
11) 値の挿入( short value から)
この関数は FormattedOutputFunction として動作する。セントリオブジェクトを構築・チェックした後、 long lval (2) のように挿入する。ここで lval は以下のいずれかである:
12) int value から値を挿入します。
この関数は FormattedOutputFunction として動作する。セントリオブジェクトを構築・チェックした後、 (2) のように lval long 値を挿入する。ここで lval は以下のいずれかである:
13,14) 値( unsigned short または unsigned int )を挿入します。
この関数は FormattedOutputFunction として動作します。セントリオブジェクトの構築とチェックの後、 static_cast < unsigned long > ( value ) (3) のように挿入します。
15) float value から値を挿入します。
この関数は FormattedOutputFunction として動作する。セントリオブジェクトを構築・チェックした後、 static_cast < double > ( value ) (6) のように挿入する。
16) value から値を挿入します。ライブラリは、パラメータvalueの型としてすべてのcv修飾されていない extended floating-point types に対するオーバーロードを提供します。
この関数は FormattedOutputFunction として動作する。セントリオブジェクトを構築・チェックした後、 浮動小数点変換ランク をチェックする:
  • ランクが double 以下である場合、 static_cast < double > ( value ) (6) のように挿入する。
  • それ以外の場合、ランクが long double 以下である場合、 static_cast < long double > ( value ) (7) のように挿入する。
  • それ以外の場合、このオーバーロードの呼び出しは条件付きでサポートされ、実装定義のセマンティクスを持つ。
17) この関数は UnformattedOutputFunction として動作する。セントリオブジェクトを構築・チェックした後、 sb がヌルポインタかどうかをチェックする。ヌルポインタの場合、 setstate ( badbit ) を実行して終了する。それ以外の場合、 sb によって制御される入力シーケンスから文字を抽出し、それらを * this に挿入する。以下のいずれかの条件が満たされるまでこの処理を継続する:
  • 入力シーケンスでEOF(ファイル終端)が発生する;
  • 出力シーケンスへの挿入が失敗する(この場合、挿入対象の文字は抽出されない);
  • 例外が発生する(この場合、例外は捕捉される)。
文字が一つも挿入されなかった場合、 setstate ( failbit ) を実行する。抽出中に例外がスローされた場合、 failbit を設定し、 failbit exceptions() で設定されている場合は例外を再スローする。
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 オーバーロード (12)
        << ' '            // 非メンバーオーバーロード
        << std::boolalpha // 関数オーバーロード (18)
        << b              // bool オーバーロード (1)
        << " "            // 非メンバーオーバーロード
        << std::fixed     // 関数オーバーロード (18) 再び
        << f              // double オーバーロード (6)
        << input.rdbuf()  // streambuf オーバーロード
        << fun            // bool オーバーロード (1): int(*)() のオーバーロードは存在しない
        << std::endl;     // 関数オーバーロード (18) 再び
    int x = 0;
    int* p1 = &x;
    volatile int* p2 = &x;
    std::cout
        << "p1: " << p1 << '\n'  // `const void*` オーバーロード、アドレスを出力
        << "p2: " << p2 << '\n'; // C++23 以前 (P1147): bool オーバーロード :)、なぜなら
            // operator<<(const void*) は `volatile` 修飾子を破棄するため適合しない
            // これを修正するため、C++23 は `const volatile void*` オーバーロード (9) を追加し、
            // 期待通りアドレスを出力する
}

出力例:

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 C++98 オーバーロード (17) FormattedOutputFunction として動作した
LWG issue 60 の解決による)
これは
UnformattedOutputFunction として動作する

関連項目

文字データを挿入、または右辺値ストリームに挿入
(関数テンプレート)
文字列に対するストリーム入出力を実行
(関数テンプレート)
(C++17)
文字列ビューに対するストリーム出力を実行
(関数テンプレート)
ビットセットのストリーム入出力を実行
(関数テンプレート)
複素数のシリアライズとデシリアライズ
(関数テンプレート)
擬似乱数エンジンに対するストリーム入出力を実行
(関数テンプレート)
擬似乱数分布に対するストリーム入出力を実行
(関数テンプレート)
文字を挿入
(公開メンバ関数)
文字ブロックを挿入
(公開メンバ関数)
(C++17)
整数または浮動小数点値を文字シーケンスに変換
(関数)