Namespaces
Variants

std::basic_ostream<CharT,Traits>:: operator<<

From cppreference.net
basic_ostream & operator << ( bool value ) ;
(1)
basic_ostream & operator << ( long value ) ;
(2)
basic_ostream & operator << ( unsigned long value ) ;
(3)
basic_ostream & operator << ( long long value ) ;
(4) (自 C++11 起)
basic_ostream & operator << ( unsigned long long value ) ;
(5) (自 C++11 起)
basic_ostream & operator << ( double value ) ;
(6)
basic_ostream & operator << ( long double value ) ;
(7)
basic_ostream & operator << ( const void * value ) ;
(8)
basic_ostream & operator << ( const volatile void * value ) ;
(9) (自 C++23 起)
basic_ostream & operator << ( std:: nullptr_t ) ;
(10) (自 C++17 起)
basic_ostream & operator << ( short value ) ;
(11)
basic_ostream & operator << ( int value ) ;
(12)
basic_ostream & operator << ( unsigned short value ) ;
(13)
basic_ostream & operator << ( unsigned int value ) ;
(14)
basic_ostream & operator << ( float value ) ;
(15)
basic_ostream & operator << ( /* 扩展浮点类型 */ value ) ;
(16) (自 C++23 起)
basic_ostream & operator << ( std:: basic_streambuf < CharT, Traits > * sb ) ;
(17)
basic_ostream & operator << (
std:: ios_base & ( * func ) ( std:: ios_base & ) ) ;
(18)
basic_ostream & operator << (
std:: basic_ios < CharT, Traits > & ( * func ) ( std:: basic_ios < CharT, Traits > & ) ) ;
(19)
basic_ostream & operator << (

std:: basic_ostream < CharT, Traits > & ( * func )

( std:: basic_ostream < CharT, Traits > & ) ) ;
(20)

向流中插入数据。

1-8) 插入 value
此函数的行为类似于 格式化输出函数 。在构造并检查哨兵对象后,通过调用 std::num_put::put() 插入值。若在输出过程中遇到文件结束条件( put ( ) . failed ( ) == true ),则设置 badbit
9) 等价于 return operator << ( const_cast < const void * > ( p ) ) ;
10) 等价于 return * this << s ; ,其中 s 是一个实现定义的以空字符结尾的字符类型字符串。
11) short value 插入一个值。
此函数的行为类似于 格式化输出函数 。构造并检查哨兵对象后,按照 (2) 的方式插入 long lval ,其中 lval 为:
12) int value 插入一个值。
此函数的行为类似于 格式化输出函数 。构造并检查哨兵对象后,按照 (2) 的方式插入 long lval ,其中 lval 为:
13,14) 插入来自 unsigned short unsigned int value 值。
此函数的行为类似于 格式化输出函数 。在构造并检查哨兵对象后,如 (3) 所述插入 static_cast < unsigned long > ( value )
15) float value 插入一个值。
此函数的行为类似于 格式化输出函数 。在构造并检查哨兵对象后,按照 (6) 中的方式插入 static_cast < double > ( value )
16) 插入来自 value 的值。该库为所有 cv-未限定的 扩展浮点类型 作为参数 value 的类型提供了重载。
此函数的行为符合 格式化输出函数 的要求。在构造并检查哨兵对象后,会检查 /* extended-floating-point-type */ 浮点转换等级
  • 若该等级小于等于 double ,则按 (6) 的方式插入 static_cast < double > ( value )
  • 否则,若该等级小于等于 long double ,则按 (7) 的方式插入 static_cast < long double > ( value )
  • 否则,此重载的调用在条件性支持的情况下具有实现定义的语义。
17) 此函数表现为 无格式输出函数 。构造并检查哨兵对象后,检查 sb 是否为空指针。若是,则执行 setstate ( badbit ) 并退出。否则,从 sb 控制的输入序列中提取字符,并将其插入到 * this 中,直到满足以下任一条件:
  • 输入序列遇到文件结尾;
  • 输出序列插入失败(此时待插入字符不会被提取);
  • 发生异常(此时异常会被捕获)。
若未插入任何字符,则执行 setstate ( failbit ) 。若在提取过程中抛出异常,则设置 failbit ,且若 failbit exceptions() 中被设置,则重新抛出该异常。
18-20) 调用 func ( * this ) 。这些重载用于实现输出 I/O 操纵器,例如 std::endl

目录

参数

value - 要插入的整型、浮点型、布尔型或指针值
func - 要调用的函数
sb - 指向要从中读取数据的流缓冲区的指针

返回值

1-19) * this
20) func ( * this )

注释

不存在针对指向非静态成员的指针 、指向volatile的指针 (直至C++23) 或函数指针的重载(除了那些被 ( 18-20 ) 重载接受的签名类型)。

  • 尝试输出此类对象会触发向 bool 的隐式转换,对于任何非空指针值,将输出数值 1 (除非设置了 boolalpha ,此时将输出 true )。

字符和字符串参数(例如类型为 char const char * )由 operator << 非成员重载 处理。

  • 尝试使用成员函数调用语法输出字符(例如, std:: cout . operator << ( 'c' ) ; )将调用 ( 2-5 ) ( 11-14 ) 中的重载版本并输出数值。
  • 尝试使用成员函数调用语法输出字符串将调用重载版本 (8) 并打印指针值而非字符串内容。

重载 (10) LWG 问题 2221 的决议所添加,但在 C++11/14 模式下从未在任何标准库实现中得到实现。

示例

#include <iomanip>
#include <iostream>
#include <sstream>
int fun() { return 42; }
int main()
{
    std::istringstream input(" \"Some text.\" ");
    double f = 3.14;
    bool b = true;
    std::cout
        << fun()          // int 重载 (12)
        << ' '            // 非成员函数重载
        << std::boolalpha // 函数重载 (18)
        << b              // bool 重载 (1)
        << " "            // 非成员函数重载
        << std::fixed     // 函数重载 (18) 再次调用
        << f              // double 重载 (6)
        << input.rdbuf()  // streambuf 重载
        << fun            // bool 重载 (1): 不存在 int(*)() 的重载版本
        << std::endl;     // 函数重载 (18) 再次调用
    int x = 0;
    int* p1 = &x;
    volatile int* p2 = &x;
    std::cout
        << "p1: " << p1 << '\n'  // `const void*` 重载,输出地址
        << "p2: " << p2 << '\n'; // C++23 前 (P1147): bool 重载 :),因为
            // operator<<(const void*) 不匹配,它会丢弃 `volatile`
            // 限定符。为解决此问题,C++23 新增了 `const volatile void*` 重载 (9),
            // 按预期输出地址。
}

可能的输出:

42 true 3.140000 "Some text." true
p1: 0x7ffcea766600
p2: 0x7ffcea766600

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 117 C++98 重载 (1-8,11-15) 将插入操作委托给
num_put::put ,但该函数没有针对 short
unsigned short int unsigned int float 的重载版本
在传递给 num_put::put 之前
先进行类型转换
LWG 567 C++98 重载 (17) LWG 问题 60 的解决方案
而表现为 FormattedOutputFunction
表现为
UnformattedOutputFunction

参见

插入字符数据或插入到右值流
(函数模板)
对字符串执行流输入和输出
(函数模板)
(C++17)
对字符串视图执行流输出
(函数模板)
对位集执行流输入和输出
(函数模板)
序列化和反序列化复数
(函数模板)
对伪随机数引擎执行流输入和输出
(函数模板)
对伪随机数分布执行流输入和输出
(函数模板)
插入一个字符
(公开成员函数)
插入字符块
(公开成员函数)
(C++17)
将整数或浮点数值转换为字符序列
(函数)