[ Thanks to Per Bothner and Jerry Schwarz for this section. ]
Assigning one stream to another seems like a reasonable thing to do, but
it's a bad idea. Usually, this comes up because people want to assign
to cout. This is poor style, especially for libraries, and is
contrary to good object-oriented design. (Libraries that write directly
to cout are less flexible, modular, and object-oriented).
The iostream classes do not allow assigning to arbitrary streams, because this can violate typing:
ifstream foo ("foo");
istrstream str(...);
foo = str;
foo->close (); /* Oops! Not defined for istrstream! */
The original cfront implementation of iostreams by Jerry Schwarz allows
you to assign to cin, cout, cerr, and clog,
but this is not part of the draft standard for iostreams and generally
isn't considered a good idea, so standard-conforming code shouldn't use
this technique.
The GNU implementation of iostream did not support assigning to
cin, cout, cerr, and clog
for quite a while, but it now does, for backward
compatibility with cfront iostream (versions 2.6.1 and later of libg++).
The ANSI/ISO C++ Working Paper does provide ways of changing the streambuf associated with a stream. Assignment isn't allowed; there is an explicit named member that must be used.
However, it is not wise to do this, and the results are confusing. For
example: fstream::rdbuf is supposed to return the original
filebuf, not the one you assigned. (This is not yet implemented in GNU
iostream.) This must be so because fstream::rdbuf is defined to
return a filebuf *.