名前空間
変種
操作

operator<<(std::basic_ostream)

From cppreference.com
< cpp‎ | io‎ | basic_ostream
 
 
 
 
ヘッダ<ostream>で定義
basic_ostreamと文字
(1)
template< class CharT, class Traits >

basic_ostream<CharT, Traits>&

    operator<<( basic_ostream<CharT, Traits>& os, CharT ch );
template< class CharT, class Traits >

basic_ostream<CharT, Traits>&

    operator<<( basic_ostream<CharT, Traits>& os, char ch );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, char ch );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, signed char ch );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, unsigned char ch );
basic_ostreamと文字配列
(2)
template< class CharT, class Traits >

basic_ostream<CharT, Traits>&

    operator<<( basic_ostream<CharT, Traits>& os, const CharT* s );
template< class CharT, class Traits >

basic_ostream<CharT, Traits>&

    operator<<( basic_ostream<CharT, Traits>& os, const char* s );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const char* s );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const signed char* s );
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const unsigned char* s );
basic_ostream の右辺値
template< class Ostream, class T >
Ostream&& operator<<( Ostream&& os, const T& value );
(3) (C++11以降)
basic_ostream と UTF 文字/配列の削除されたオーバーロード
(4) (C++20以降)
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, wchar_t ch ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, char8_t ch ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, char16_t ch ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, char32_t ch ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, char8_t ch ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, char16_t ch ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, char32_t ch ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const wchar_t* s ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const char8_t* s ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const char16_t* s ) = delete;
template< class Traits >

basic_ostream<char, Traits>&

    operator<<( basic_ostream<char, Traits>& os, const char32_t* s ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, const char8_t* s ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, const char16_t* s ) = delete;
template< class Traits >

basic_ostream<wchar_t, Traits>&

    operator<<( basic_ostream<wchar_t, Traits>& os, const char32_t* s ) = delete;

文字または文字文字列を挿入します。

1) FormattedOutputFunctionとして動作します。sentryオブジェクトを構築およびチェックした後、文字chを挿入します。chの型がcharで、os文字コンテナ型charでない場合、代わりにos.widen(ch)が挿入されます。
パディングは次のように決定されます。
  • もし os.width() > 1 ならば、os.width() - 1 個の os.fill() のコピーが出力文字に追加され、出力文字シーケンスが形成されます。
  • もし (out.flags() & std::ios_base::adjustfield) == std::ios_base::left ならば、パディング文字は出力文字の後に追加され、そうでなければ前に追加されます。
挿入後、os.width(0) が呼び出され、もしあれば std::setw の効果がキャンセルされます。
2) FormattedOutputFunctionとして動作します。sentryオブジェクトを構築およびチェックした後、sが指す文字配列の先頭から successive characters を挿入します。
  • 最初のオーバーロードと3番目のオーバーロード(CharTchの型と一致する場合)では、正確にtraits::length(s)文字が挿入されます。
  • 2番目のオーバーロードでは、正確にstd::char_traits<char>::length(s)文字が挿入されます。
  • 最後の2つのオーバーロードでは、正確にtraits::length(reinterpret_cast<const char*>(s))文字が挿入されます。
挿入前に、まず、すべての文字がos.widen()を使用してwidenedされ、次にパディングが次のように決定されます。
  • 挿入される文字数がos.width()よりも少ない場合、文字シーケンスの長さがos.width()と等しくなるように、os.fill()のコピーが十分に追加されます。
  • もし (out.flags() & std::ios_base::adjustfield) == std::ios_base::left ならば、パディング文字は出力シーケンスの末尾に追加され、そうでなければ出力シーケンスの前に追加されます。
挿入後、os.width(0) が呼び出され、もしあれば std::setw の効果がキャンセルされます。
もし s がヌルポインタの場合、動作は未定義です。
3) 出力ストリームオブジェクトへの右辺値参照が与えられた場合、適切な挿入演算子を呼び出します(os << valueと同等)。このオーバーロードは、式 os << value がwell-formedであり、かつOstreamstd::ios_baseから公開かつ一意に派生したクラス型である場合にのみ、オーバーロード解決に参加します。
4) char16_tchar32_tなどを(またはそれらのヌル終端シーケンスを)受け入れるオーバーロードは削除されました:std::cout << u'X'は許可されません。以前は、これらは整数またはポインタ値を表示していました。

目次

[編集] パラメータ

os - データを挿入する出力ストリーム
文字 - 挿入する文字への参照
s - 挿入する文字文字列へのポインタ

[編集] 戻り値

1,2) os
3) std::move(os)

[編集] 注釈

LWG issue 1203 より前は、(std::ostringstream() << 1.2).str()のようなコードはコンパイルされませんでした。

[編集]

#include <fstream>
#include <iostream>
 
void foo()
{
    // error: operator<< (basic_ostream<char, _Traits>&, char8_t) is deleted
//  std::cout << u8'z' << '\n';
}
 
std::ostream& operator<<(std::ostream& os, char8_t const& ch)
{
    return os << static_cast<char>(ch);
}
 
int main()
{
    std::cout << "Hello, world" // uses `const char*` overload
              << '\n';          // uses `char` overload
    std::ofstream{"test.txt"} << 1.2; // uses rvalue overload
 
    std::cout << u8'!' << '\n'; // uses program-defined operator<<(os, char8_t const&)
}

出力

Hello, world
!

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 167 C++98 (2) のすべてのオーバーロードで挿入される文字数
traits::length(s) でした
オーバーロードの数値が更新されました
CharTchの型と一致しない場合
LWG 1203 C++11 右辺値ストリームのオーバーロードが返された
基底クラスへの左辺値参照
右辺値参照を返します
派生クラスへ
LWG 2011 C++98 パディングは std::num_put::do_put() によって決定されていました 演算子自体によって決定されます
LWG 2534 C++11 右辺値ストリームのオーバーロードに制約がありませんでした 制約付き

[編集] 関連項目

書式付きデータを挿入する
(public member function) [編集]
引数の書式化された表現を出力する
(関数テンプレート) [編集]
文字をワイド化する
(std::basic_ios<CharT,Traits> の public メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)