From cppreference.com
Defined in header
externstd::ostreamcerr; (1) externstd::wostreamwcerr; (2) The global objects std::cerr and std::wcerr control output to a stream buffer of implementation-defined type (derived from
and
, respectively), associated with the standard C error output stream
.
These objects are guaranteed to be initialized during or before the first time an object of type
is constructed and are available for use in the constructors and destructors of static objects with
(as long as
is included before the object is defined).
Unless std::ios_base::sync_with_stdio(false) has been issued, it is safe to concurrently access these objects from multiple threads for both formatted and unformatted output.
Once initialized, (std::cerr.flags()&unitbuf)!=0 (same for std::wcerr) meaning that any output sent to these stream objects is immediately flushed to the OS (via
's destructor).
In addition, std::cerr.tie() returns &std::cout (same for std::wcerr and
), meaning that any output operation on std::cerr first executes std::cout.flush() (via
's constructor).
Notes
The 'c' in the name refers to "character" (
); cerr means "character error (stream)" and wcerr means "wide character error (stream)".
Example
Output to
via std::cerr flushes out the pending output on
, while output to
via
does not.
Run this code
#include<chrono>#include<iostream>#include<thread>usingnamespacestd::chrono_literals;voidf(){std::cout<<"Output from thread...";std::this_thread::sleep_for(2s);std::cout<<"...thread calls flush()"<<std::endl;}intmain(){std::jthreadt1{f};std::this_thread::sleep_for(1000ms);std::clog<<"This output from main is not tie()'d to cout\n";std::cerr<<"This output is tie()'d to cout\n";}Possible output:
This output from main is not tie()'d to cout Output from thread...This output is tie()'d to cout ...thread calls flush() Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++98 std::cerr.tie() and
std::wcerr.tie() returned null pointers they return &std::cout and
&std::wcout respectively See also
initializes standard stream objects
(public member class of std::ios_base)
writes to the standard C error stream
(global object)
writes to the standard C output stream
(global object)
expression of type FILE* associated with the input stream
expression of type FILE* associated with the output stream
expression of type FILE* associated with the error output stream
(macro constant)