Namespaces
Variants

operator<<(std::basic_ostream)

С ru.cppreference.net
 
 
Библиотека ввода/вывода
Манипуляторы ввода/вывода
Функции print (C++23)
Ввод/вывод в стиле C
Буферы
(C++98/26*)
Потоки
Абстракции
Файловый ввод/вывод
Строковый ввод/вывод
Массивовый ввод/вывод
(C++98/26*)
(C++98/26*)
(C++98/26*)
Синхронизированный вывод
Типы
Интерфейс категории ошибок
(C++11)
 
std::basic_ostream
Глобальные объекты
Функции-члены
Форматированный вывод
Неформатированный вывод
Позиционирование
Разное
Вложенные классы
Функции, не являющиеся членами
 
Определён в заголовке <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 rvalue
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) Вызывает соответствующий оператор вставки для rvalue-ссылки на объект выходного потока (эквивалентно 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 issue 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; // использует перегрузку для rvalue
    std::cout << u8'!' << '\n'; // использует программируемый operator<<(os, char8_t const&)
}

Вывод:

Hello, world
!

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 167 C++98 количество вставленных символов для всех
перегрузок в (2) было traits :: length ( s )
обновлены числа для перегрузок,
где CharT не соответствует типу ch
LWG 1203 C++11 перегрузка для rvalue потока возвращала
lvalue ссылку на базовый класс
возвращает rvalue ссылку
на производный класс
LWG 2011 C++98 заполнение определялось std::num_put::do_put() определяется самим оператором
LWG 2534 C++11 перегрузка для rvalue потока не была ограничена ограничена

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

вставляет форматированные данные
(public member function)
выводит форматированное представление аргументов
(function template)
расширяет символы
(public member function of std::basic_ios<CharT,Traits> )