Strictly speaking, cout does not need to be physically buffered. As described in the standard, the difference between cout and cerr (apart from the fact they are different streams) is that cerr.flags() & unitbuf is non-zero while cout.flags() & unitbuf is zero. The literal meaning of the unitbuf flag being set is that the stream will be flushed on each output operation. However, if the unitbuf flag is zero, it is up to the implementer as to when (or if) flushing is necessary. This means that cout is not necessarily physically buffered.

One other characteristic, of some libraries, is that cout is buffered, but flushed whenever output to cerr (and sometimes clog) occurs --- not just when something is read from cin. This is a nicety by some library implementers, and the intent is to ensure that messages to a console are coherent.