operator<<(std::basic_ostream)
С ru.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 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) |
|
|
(C++23)
|
выводит
форматированное
представление аргументов
(function template) |
|
расширяет символы
(public member function of
std::basic_ios<CharT,Traits>
)
|