Namespaces
Variants

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

From cppreference.net
(Примечание: В данном фрагменте HTML отсутствует текстовое содержимое для перевода - присутствуют только HTML-теги и атрибуты, которые согласно инструкциям не подлежат переводу)
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 - это определенная реализацией строка символов с нулевым завершением.
11) Вставляет значение из short value .
Эта функция ведет себя как FormattedOutputFunction . После создания и проверки объекта sentry, вставляет значение типа long lval как в (2) , где lval это
12) Вставляет значение из int value .
Эта функция ведет себя как FormattedOutputFunction . После создания и проверки сторожевого объекта вставляет значение типа long lval как в (2) , где lval равно
13,14) Вставляет значение из unsigned short или unsigned int value .
Эта функция ведет себя как FormattedOutputFunction . После создания и проверки сторожевого объекта, вставляет static_cast < unsigned long > ( value ) как в (3) .
15) Вставляет значение из float value .
Эта функция ведет себя как FormattedOutputFunction . После создания и проверки сторожевого объекта, вставляет static_cast < double > ( value ) как в (6) .
16) Вставляет значение из value . Библиотека предоставляет перегрузки для всех cv-неквалифицированных расширенных типов с плавающей точкой в качестве типа параметра value.
Эта функция ведет себя как 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 и, если failbit установлен в exceptions() , исключение перевыбрасывается.
18-20) Вызывает func ( * this ) . Эти перегрузки используются для реализации манипуляторов вывода ввода-вывода, таких как 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 issue 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++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
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) вела себя как FormattedOutputFunction
из-за решения LWG issue 60
она ведет себя как
UnformattedOutputFunction

Смотрите также

вставляет символьные данные или вставляет в rvalue-поток
(шаблон функции)
выполняет потоковый ввод и вывод для строк
(шаблон функции)
(C++17)
выполняет потоковый вывод для string views
(шаблон функции)
выполняет потоковый ввод и вывод для bitset
(шаблон функции)
сериализует и десериализует комплексное число
(шаблон функции)
выполняет потоковый ввод и вывод для генератора псевдослучайных чисел
(шаблон функции)
выполняет потоковый ввод и вывод для распределения псевдослучайных чисел
(шаблон функции)
вставляет символ
(публичная функция-член)
вставляет блоки символов
(публичная функция-член)
(C++17)
преобразует целочисленное или вещественное значение в последовательность символов
(функция)