命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | io‎ | basic ostream
 
 
 
 
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<<( /* extended-floating-point-type */ 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.
此函数的行为如同一个 FormattedOutputFunction。在构造并检查哨兵对象后,通过调用 std::num_put::put() 插入值。如果在输出期间遇到文件结尾条件(put().failed() == true),则设置 badbit
9) 等同于 return operator<<(const_cast<const void*>(p));.
10) 等同于 return *this << s;,其中 s 是一个实现定义的以 null 结尾的字符类型字符串。
11)short value 插入值。
此函数的行为如同一个 FormattedOutputFunction。在构造并检查哨兵对象后,插入一个 longlval,如同 (2) 中一样,其中 lval
12)int value 插入值。
此函数的行为如同一个 FormattedOutputFunction。在构造并检查哨兵对象后,插入一个 longlval,如同 (2) 中一样,其中 lval
13,14) 插入来自 unsigned shortunsigned int 的值 value.
此函数的行为类似于 FormattedOutputFunction。在构造和检查哨兵对象后,插入 static_cast<unsigned long>(value),如 (3) 所示。
15) 插入来自 float 的值 value.
此函数的行为类似于 FormattedOutputFunction。在构造和检查哨兵对象后,插入 static_cast<double>(value),如 (6) 所示。
16) 插入来自 value 的值。库为所有 cv 无限定的 扩展浮点类型 提供重载作为参数值类型。
此函数的行为类似于 FormattedOutputFunction。在构造和检查哨兵对象后,检查 /* extended-floating-point-type */浮点转换等级
  • 如果等级小于或等于 double 的等级,则插入 static_cast<double>(value),如 (6) 所示。
  • 否则,如果等级小于或等于 long double 的等级,则插入 static_cast<long double>(value),如 (7) 所示。
  • 否则,此重载的调用将以实现定义的语义有条件地支持。
17) 此函数的行为类似于 UnformattedOutputFunction。在构造和检查哨兵对象后,检查 sb 是否为空指针。如果是,则执行 setstate(badbit) 并退出。否则,从由 sb 控制的输入序列中提取字符,并将它们插入 *this,直到满足以下条件之一
  • 输入序列上发生文件结束;
  • 在输出序列中插入失败(在这种情况下,不会提取要插入的字符);
  • 发生异常(在这种情况下,会捕获异常)。
如果没有插入任何字符,则执行 setstate(failbit)。如果在提取时抛出异常,则设置 failbit,并且如果在 exceptions() 中设置了 failbit,则重新抛出异常。
18-20) 调用 func(*this)。这些重载用于实现输出 I/O 操作符,例如 std::endl

内容

[编辑] 参数

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

[编辑] 返回值

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

[编辑] 说明

没有针对指向非静态成员的指针、指向易变量的指针(直到 C++23)或函数指针(除了由 (18-20) 重载接受的签名以外的指针)的重载。

  • 尝试输出此类对象将隐式转换为 bool,并且,对于任何非空指针值,将打印值 1(除非设置了 boolalpha,在这种情况下将打印 true)。

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

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

[编辑] 示例

#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 overload (12)
        << ' '            // non-member overload
        << std::boolalpha // function overload (18)
        << b              // bool overload (1)
        << " "            // non-member overload
        << std::fixed     // function overload (18) again
        << f              // double overload (6)
        << input.rdbuf()  // streambuf overload
        << fun            // bool overload (1): there's no overload for int(*)()
        << std::endl;     // function overload (18) again
 
    int x = 0;
    int* p1 = &x;
    volatile int* p2 = &x;
    std::cout
        << "p1: " << p1 << '\n'  // `const void*` overload, prints address
        << "p2: " << p2 << '\n'; // before C++23 (P1147): bool overload :), because
            // operator<<(const void*) is not a match, as it discards the `volatile`
            // qualifier. To fix this, C++23 adds `const volatile void*` overload (9),
            // that prints the address as expected.
}

可能的输出

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

[编辑] 缺陷报告

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

DR 应用于 发布的行为 正确的行为
LWG 117 C++98 重载 (1-8,11-15) 将插入委托给
num_put::put,但它没有针对 short 的重载,
unsigned short, int, unsigned intfloat
它们被转换
在传递之前
num_put::put
LWG 567 C++98 重载 (17) 的行为类似于 FormattedOutputFunction
由于 LWG 问题 60 的解决
它的行为类似于
UnformattedOutputFunction

[编辑] 另请参阅

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