This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.
basic_stringbuf
default constructor forbids it from using SSO capacitySection: 31.8.2.2 [stringbuf.cons] Status: C++20 Submitter: Jonathan Wakely Opened: 2017-07-07 Last modified: 2021-02-25
Priority: 3
View all other issues in [stringbuf.cons].
View all issues with C++20 status.
Discussion:
[stringbuf.cons] says that the default constructor initializes the
base class as basic_streambuf()
which means the all the pointers to
the input and output sequences (pbase
, eback
etc) are all required to
be null.
stringbuf
that is implemented in terms of a Small
String Optimised std::basic_string
cannot make us of the string's
initial capacity, and so cannot avoid a call to the overflow virtual
function even for small writes. In other words, the following
assertions must pass:
#include <sstream> #include <cassert> bool overflowed = false; struct SB : std::stringbuf { int overflow(int c) { assert( pbase() == nullptr ); overflowed = true; return std::stringbuf::overflow(c); } }; int main() { SB sb; sb.sputc('1'); assert(overflowed); }
This is an unnecessary pessimisation. Implementations should be allowed to use the SSO buffer immediately and write to it without calling overflow. Libc++ already does this, so is non-conforming.
[2017-07 Toronto Tuesday PM issue prioritization]
Priority 3; is this affected by Peter Sommerlad's paper P0407R1?
[2018-06 Rapperswil Wednesday issues processing]
Status to Ready
[2018-11, Adopted in San Diego]
Proposed resolution:
This wording is relative to N4659.
Edit 31.8.2.2 [stringbuf.cons] as indicated:
explicit basic_stringbuf( ios_base::openmode which = ios_base::in | ios_base::out);-1- Effects: Constructs an object of class
-2- Postconditions:basic_stringbuf
, initializing the base class withbasic_streambuf()
(31.6.3.2 [streambuf.cons]), and initializingmode
withwhich
. It is implementation-defined whether the sequence pointers (eback()
,gptr()
,egptr()
,pbase()
,pptr()
,epptr()
) are initialized to null pointers.str() == ""
.