operator<<(std::basic_ostream)
出自cppreference.com
| 在標頭 <ostream> 定義
|
||
basic_ostream 與字符 |
||
| (1) | ||
| |
||
| |
||
| |
||
| |
||
| |
||
basic_ostream 與字符數組 |
||
| (2) | ||
| |
||
| |
||
| |
||
| |
||
| |
||
basic_ostream 右值 |
||
| |
(3) | (C++11 起) |
basic_ostream 與 UTF 字符/數組的被刪除重載 |
||
| (4) | (C++20 起) | |
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
| |
||
插入字符或字符串。
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 指向其首元素的字符數組中的相繼字符。
- 對於第一和第三重載(其中
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_t、char32_t 等類型(或它們的空終止序列)的重載被棄置:不允許 std::cout << u'X'。這些重載之前會打印整數或指針值。參數
| os | - | 要插入數據的輸出流 |
| ch | - | 要插入的字符 |
| s | - | 指向要插入的字符串的指針 |
返回值
1,2)
os3)
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)
|
更新 CharT 與 ch 的類型不匹配的重載插入的字符數 |
| LWG 1203 | C++11 | 右值流的重載返回到基類的左值引用 | 返回到派生類的右值引用 |
| LWG 2011 | C++98 | 填充由 std::num_put::do_put() 確定 | 由運算符自身確定 |
| LWG 2534 | C++11 | 右值流的重載未被制約 | 已制約 |
參閱
| 插入帶格式數據 (公開成員函數) | |
(C++23) |
輸出各實參的格式化表示 (函數模板) |
| 拓寬字符 ( std::basic_ios<CharT,Traits> 的公開成員函數)
|