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.

3083. What should ios::iword(-1) do?

Section: 31.5.2.6 [ios.base.storage] Status: C++20 Submitter: Jonathan Wakely Opened: 2018-03-16 Last modified: 2021-02-25

Priority: 0

View all other issues in [ios.base.storage].

View all issues with C++20 status.

Discussion:

Is calling iword and pword with a negative argument undefined, or should it cause a failure condition (and return a valid reference)? What about INT_MAX? What about 0?

Using arbitrary indices isn't safe, because the implementation could be already using them for something else. Some replies on the reflector suggested the only reliable argument is one obtained from ios_base::xalloc(). Others pointed out that the iwords and pwords could be stored in sparse arrays, so that any value from INT_MIN to INT_MAX could be a valid key (which might require the implementation to use keys outside that range for its own entries in the arrays).

If it's undefined we should add a Requires element to the spec. If invalid indices are supposed to cause a failure we need to define which indices are invalid (and ensure that's something the implementation can check), and specify that it causes a failure.

[ 2018-03-27 Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]

[2018-06 Rapperswil: Adopted]

Proposed resolution:

This wording is relative to N4727.

  1. Edit 31.5.2.6 [ios.base.storage] as indicated:

    long& iword(int idx);
    

    -?- Requires: idx is a value obtained by a call to xalloc.

    -3- Effects: If iarray is a null pointer, […]

    […]

    void*& pword(int idx);
    

    -?- Requires: idx is a value obtained by a call to xalloc.

    -5- Effects: If iarray is a null pointer, […]

    […]