basic_ostream& operator<<( short value ); basic_ostream& operator<<( unsigned short value ); | (1) | |
basic_ostream& operator<<( int value ); basic_ostream& operator<<( unsigned int value ); | (2) | |
basic_ostream& operator<<( long value ); basic_ostream& operator<<( unsigned long value ); | (3) | |
basic_ostream& operator<<( long long value ); basic_ostream& operator<<( unsigned long long value ); | (4) | (since C++11) |
basic_ostream& operator<<( float value ); basic_ostream& operator<<( double value ); basic_ostream& operator<<( long double value ); | (5) | |
basic_ostream& operator<<( bool value ); | (6) | |
basic_ostream& operator<<( const void* value ); | (7) | |
basic_ostream& operator<<( const volatile void* value ); | (8) | (since C++23) |
basic_ostream& operator<<( std::nullptr_t ); | (9) | (since C++17) |
basic_ostream& operator<<( std::basic_streambuf<CharT, Traits>* sb ); | (10) | |
basic_ostream& operator<<(
std::ios_base& (*func)(std::ios_base&) );
| (11) | |
basic_ostream& operator<<(
std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );
| (12) | |
basic_ostream& operator<<(
std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
| (13) |
Inserts data into the stream.
value is short or int, then casts it to unsigned short or unsigned int if ios_base::flags() & ios_base::basefield is ios_base::oct or ios_base::hex. After that, casts it to long in any case and outputs as in (3). If value is unsigned short or unsigned int, casts it to unsigned long and outputs as in (3).value is float, casts it to double and outputs as in (5). After constructing and checking the sentry object, inserts an integer, floating point, boolean or generic pointer value by calling std::num_put::put(). If the end of file condition was encountered during output (put().failed() == true), sets ios::badbit.value to const void* and outputs as in (7).*this << s, where s is a null-terminated character type string.sb is a null pointer. If it is, executes setstate(badbit) and exits. Otherwise, extracts characters from the input sequence controlled by sb and inserts them into *this until one of the following conditions are met: setstate(failbit). If an exception was thrown while extracting, sets failbit and, if failbit is set in exceptions(), rethrows the exception.func(*this). These overloads are used to implement output I/O manipulators such as std::endl.| value | - | integer, floating-point, boolean, or pointer value to insert |
| func | - | function to call |
| sb | - | pointer to the stream buffer to read the data from |
*this
func(*this)
There are no overloads for pointers to non-static members, pointers to volatiles, (until C++23) or function pointers (other than the ones with signatures accepted by the (11-13) overloads). Attempting to output such objects invokes implicit conversion to bool, and, for any non-null pointer value, the value 1 is printed (unless boolalpha was set, in which case true is printed).
Character and character string arguments (e.g., of type char or const char*) are handled by the non-member overloads of operator<<. Attempting to output a character using the member function call syntax (e.g., std::cout.operator<<('c');) will call one of overloads (2-4) and output the numerical value. Attempting to output a character string using the member function call syntax will call overload (7) and print the pointer value instead.
#include <iostream>
#include <iomanip>
#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 (2)
<< ' ' // non-member overload
<< std::boolalpha // function overload (11)
<< b // bool overload (6)
<< " " // non-member overload
<< std::fixed // function overload (11) again
<< f // double overload (5)
<< input.rdbuf() // streambuf overload
<< fun // bool overload (6): there's no overload for int(*)()
<< std::endl; // function overload (11) 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,
// that prints the address as expected.
}Possible output:
42 true 3.140000 "Some text." true p1: 0x7ffcea766600 p2: 0x7ffcea766600
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 117 | C++98 | overloads (1)-(7) delegated the insertion tonum_put::put, but it does not have overloads for short,unsigned short, int, unsigned int, and float | they are converted before being passed to num_put::put |
| inserts character data or insert into rvalue stream (function template) |
|
| performs stream input and output on strings (function template) |
|
|
(C++17) | performs stream output on string views (function template) |
| performs stream input and output of bitsets (function template) |
|
| serializes and deserializes a complex number (function template) |
|
|
(C++11) | performs stream input and output on pseudo-random number engine (function template) |
|
(C++11) | performs stream input and output on pseudo-random number distribution (function template) |
| inserts a character (public member function) |
|
| inserts blocks of characters (public member function) |
|
|
(C++17) | converts an integer or floating-point value to a character sequence (function) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt