operator<<(std::basic_ostream)

出自cppreference.com


 
 
 
 
在標頭 <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() - 1os.fill() 的副本,以組成輸出字符序列。
  • 如果 (out.flags() & std::ios_base::adjustfield) == std::ios_base::left,那麼填充字符被置於輸出字符之後,否則在其之前。
在插入後,調用 os.width(0) 以取消 std::setw 的效果(如果存在)。
2) 表現為有格式輸出函數 (FormattedOutputFunction) 。在構造並檢查 sentry 對象後,插入來自以 s 指向其首元素的字符數組中的相繼字符。
  • 對於第一和第三重載(其中 CharT 匹配 ch 的類型),恰好插入 traits::length(s) 個字符。
  • 對於第二重載,恰好插入 std::char_traits<char>::length(s) 個字符。
  • 對於最後兩個重載,恰好插入 traits::length(reinterpret_cast<const char*>(s)) 個字符。
在插入前,首先用 os.widen() 加寬所有字符,然後按下列方式確定填充:
  • 如果要插入的字符數少於 os.width(),那麼向字符序列添加足夠數量的 os.fill() 副本,使得它的長度等於 os.width()
  • 如果 (out.flags() & std::ios_base::adjustfield) == std::ios_base::left,那麼向輸出序列的末尾添加填充字符,否則將它們添加到序列之前。
在插入後,調用 os.width(0) 以取消 std::setw 的效果(如果存在)。
s 是空指針時行為未定義。
3) 給定到輸出流對象的右值引用,調用適當的插入運算符(等價於 os << value)。此重載只有在表達式 os << value 良構且 Ostream 是公開且無歧義地派生自 std::ios_base 的類類型時才會參與重載決議。
4) 接受 char16_tchar32_t 等類型(或它們的空終止序列)的重載被棄置:不允許 std::cout << u'X'。這些重載之前會打印整數或指針值。

參數

os - 要插入數據的輸出流
ch - 要插入的字符
s - 指向要插入的字符串的指針

返回值

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

註解

在解決 LWG 問題 1203 前,如 (std::ostringstream() << 1.2).str() 的代碼無法編譯。

示例

#include <fstream>
#include <iostream>
 
void foo()
{
    // 错误:operator<< (basic_ostream<char, _Traits>&, char8_t) 被弃置
//  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" // 使用 const char* 重载
              << '\n';          // 使用 char 重载
    std::ofstream("test.txt") << 1.2; // 使用右值重载
    
    std::cout << u8'!' << '\n'; // 使用程序定义的 operator<<(os, char8_t const&)
}

輸出:

Hello, world
!

缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 出版時的行為 正確行為
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 右值流的重載未被制約 已制約

參閱

插入帶格式數據
(公開成員函數) [編輯]
輸出各實參的格式化表示
(函數模板) [編輯]
拓寬字符
(std::basic_ios<CharT,Traits> 的公開成員函數) [編輯]