2341. Inconsistency between basic_ostream::seekp(pos) and basic_ostream::seekp(off, dir)

Section: 30.7.5.1.4 [ostream.seeks] Status: C++14 Submitter: Marshall Clow Opened: 2013-10-21 Last modified: 2017-07-06

Priority: 0

View all issues with C++14 status.

Discussion:

In 30.7.5.1.4 [ostream.seeks], we have:

basic_ostream<charT,traits>& seekp(pos_type pos);

-3- Effects: If fail() != true, executes rdbuf()->pubseekpos(pos, ios_base::out). In case of failure, the function calls setstate(failbit) (which may throw ios_base::failure).

-4- Returns: *this.

basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir);

-5- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::out).

-6- Returns: *this.

The first call is required to set the failbit on failure, but the second is not

So (given two ostreams, os1 and os2) the following code (confusingly) works:

os1.seekp(-1);
assert(os1.fail());

os2.seekp(-1, std::ios_base::beg);
assert(os2.good());

Note that the description of basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir) in 30.7.4.3 [istream.unformatted] p43 does require setting failbit.

[Issaquah 2014-02-11: Move to Immediate]

Proposed resolution:

This wording is relative to N3797.

  1. Modify 30.7.5.1.4 [ostream.seeks]p5 as indicated:

    basic_ostream<charT,traits>& seekp(off_type off, ios_base::seekdir dir);
    

    -5- Effects: If fail() != true, executes rdbuf()->pubseekoff(off, dir, ios_base::out). In case of failure, the function calls setstate(failbit) (which may throw ios_base::failure).

    -6- Returns: *this.