*** Can/should streambuf::sputbackc(char) assume that the putback area
is writable?

I.e. is the following a valid implementation:

int streambuf::sputbackc(char c)
{
    if (gptr() <= eback()) return pbackfail(c);
    gbump(-1);
    *gptr() = c;
    return zapeof(c);
}

Problem: what if the get area is a read-only string?
Or a copy-on-write file buffer?

How about:

int streambuf::sputbackc(char c)
{
    if (gptr() <= eback()) return pbackfail(c);
    gbump(-1);
    return zapeof(c);
}

Problem: What if we want to remember putback'ed characters
in a buffer? Solution: Make sure pbackfail is always called
in those cases.

Or the paranoid solution:

int streambuf::sputbackc(char c)
{
    if (gptr() <= eback()) return pbackfail(c);
    gbump(-1);
    if (*gptr() != c)
	*gptr() = c;
    return zapeof(c);
}

The assumptions should be specified by the standard.

*** The 2.1 Library manual page 3-19 section "Files" says:
"A subtle point is that closing a file stream (either explicitly or
implicitly in the destructor) will close the underlying file
descriptor if it was opened with a filename, but not
if it was supplied with attach."

I assume the [io]fstream::attach(fd) rule also applies to
the [io]fstream::[io]fstream(int fd) constructors?

How about filebufs? Will "delete (new filebuf(0))"
close the underlying file descriptor? What about
"(new filebuf(0))->close()"?
