operator<<(std::basic_ostream)
来自 zh.cppreference.net
| 定义于头文件 <ostream>
|
||
basic_ostream和字符 |
||
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 );
|
(1) | |
basic_ostream和字符数组 |
||
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 );
|
(2) | |
basic_ostream右值 |
||
template< class Ostream, class T >
Ostream&& operator<<( Ostream&& os, const T& value );
|
(3) | (C++11 起) |
| 针对 basic_ostream 和 UTF 字符/数组的删除重载 |
||
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;
|
(4) | (C++20 起) |
插入一个字符或一个字符串。
填充确定方式如下:
- 若
os.width() > 1,则将os.width() - 1个os.fill()副本添加到输出字符以形成输出字符序列。 - 若
(out.flags() & std::ios_base::adjustfield) == std::ios_base::left,则填充字符放在输出字符之后,否则放在之前。
插入后,调用
os.width(0) 以取消 std::setw 的效果(如有)。2) 表现为 格式化输出函数。构造并检查 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)
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++ 标准。
| DR | 适用版本 | 发布行为 | 正确行为 |
|---|---|---|---|
| LWG 167 | C++98 |
所有重载函数插入的字符数均为
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>
的公开成员函数)
|