Namespaces
Variants

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 起)

插入一个字符或一个字符串。

1) 表现为 格式化输出函数。构造并检查 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) 表现为 格式化输出函数。构造并检查 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 右值流重载未受约束 已受约束

另请参阅

插入格式化数据
(公开成员函数)
输出参数的 格式化 表示
(函数模板)
扩展字符
( std::basic_ios<CharT,Traits> 的公开成员函数)