Title
stringbuf::underflow() underspecified
Status
open
Section
[stringbuf.virtuals]
Submitter
Sergey Zubkov

Created on 2013-08-29.00:00:00 last changed 79 months ago

Messages

Date: 2018-06-12.02:06:47

Proposed resolution:

This wording is relative to N3691.

  1. Change [stringbuf.virtuals] as indicated:

    int_type underflow();
    

    -1- Returns: If the input sequence has a read position available or the function makes a read position available (as described below), returns traits::to_int_type(*gptr()). Otherwise, returns traits::eof(). Any character in the underlying buffer which has been initialized is considered to be part of the input sequence.

    -?- The function can make a read position available only if (mode & ios_base::in) != 0 and if the write next pointer pptr() is not null and is greater than the current read end pointer egptr(). To make a read position available, the function alters the read end pointer egptr() to equal pptr().

Date: 2018-06-12.02:06:47

[ 2018-06 Rapperswil Wednesday issues processing ]

Billy to provide rationale for closing as NAD.

Date: 2018-06-15.00:00:00

[ 2018-06-06, Billy argues for NAD ]

The existing "Any character in the underlying buffer which has been initialized is considered to be part of the input sequence." sentence already describes what the stringbuf is supposed to do to the get area. The specific mechanism that the stringbuf uses to alter the get area is unspecified because the mechanism by which the stringbuf remembers the "high water mark" is unspecified.

Consider the following:

stringstream s;
s << "Hello";
s.seekp(0);
string x;
s >> x;

Before this P/R, this will store Hello in x, because the characters Hello are initialized. After this P/R, the "written put area" is empty, so it will store the empty string in x.

Saying that the initialized part of the string is used already describes what needs to happen here.

Date: 2013-08-29.00:00:00

In [stringbuf.virtuals]/1, basic_stringbuf::underflow() is specified to unconditionally return traits::eof() when a read position is not available.

The semantics of basic_stringbuf require, and existing libraries implement it so that this function makes a read position available if possible to do so, e.g. if some characters were inserted into the stream since the last call to overflow(), resulting in pptr() > egptr(). Compare to the conceptually similar [depr.strstreambuf.virtuals]/15.

History
Date User Action Args
2018-06-12 02:06:47adminsetmessages: + msg9899
2018-06-06 21:44:41adminsetmessages: + msg9870
2018-06-06 21:44:41adminsetstatus: new -> open
2013-08-31 21:21:06adminsetmessages: + msg6579
2013-08-29 00:00:00admincreate