iostream objects cin, cout, cerr, and clog are objects declared in the iostream header.
I'm aware that it's possible in some compilers to attempt to use these iostream objects before they are constructed, so under some circumstances they must be subject to the "static initialisation order fiasco". In those compilers where it's always safe to use std::cout et al, how do these objects actually get constructed? Does it involve under-the-hood compiler magic or could it in principle all be done with standard C++?
std::cout etc seem to be either global variables or singleton: why are global variables and singletons usually considered evil but seemingly not in this particular case?