Title
iterator_traits<OutIt>::reference can and can't be void
Status
c++17
Section
[iterator.iterators]
Submitter
Stephan T. Lavavej

Created on 2014-10-01.00:00:00 last changed 90 months ago

Messages

Date: 2015-03-29.19:11:58

Proposed resolution:

This wording is relative to N3936.

  1. In [iterator.iterators] Table 106 "Iterator requirements" change as indicated:

    Table 106 — Iterator requirements
    Expression Return type Operational
    semantics
    Assertion/note pre-/post-condition
    *r referenceunspecified pre: r is dereferenceable.
  2. In [input.iterators] Table 107 "Input iterator requirements" change as indicated:

    Table 107 — Input iterator requirements (in addition to Iterator)
    Expression Return type Operational
    semantics
    Assertion/note pre-/post-condition
    *a reference, convertible to T […]
Date: 2015-03-29.19:11:58

[ 2015-02 Cologne ]

EF: This is related to 2438. MC: I'd like to take up 2438 right after this.

AM: Does anyone think this is wrong?

GR: Why do we give output iterators to have reference type void? AM: we've mandated that certain output iterators define it as void since 1998. GR: Oh OK, I'm satisfied.

Accepted. And 2438 is already Ready.

Date: 2014-10-09.18:37:01

[iterator.iterators]/2 requires an Iterator's *r to return reference, i.e. iterator_traits<X>::reference according to [iterator.requirements.general]/11.

[output.iterators]/1 requires an OutputIterator's *r = o to do its job, so *r clearly can't return void.

[iterator.traits]/1 says: "In the case of an output iterator, the types

iterator_traits<Iterator>::difference_type
iterator_traits<Iterator>::value_type
iterator_traits<Iterator>::reference
iterator_traits<Iterator>::pointer

may be defined as void."

This is contradictory. I suggest fixing this by moving the offending requirement down from Iterator to InputIterator, and making Iterator say that *r returns an unspecified type. This will have the following effects:

  • Output-only iterators will inherit Iterator's "*r returns unspecified" requirement, while [iterator.traits]/1 clearly permits reference/etc. to be void.

  • Input-or-stronger iterators (whether constant or mutable) are unaffected — they still have to satisfy "*r returns reference", they're just getting that requirement from InputIterator instead of Iterator.

History
Date User Action Args
2017-07-30 20:15:43adminsetstatus: wp -> c++17
2015-05-22 18:31:21adminsetstatus: ready -> wp
2015-03-29 19:11:58adminsetmessages: + msg7272
2015-03-29 19:11:58adminsetstatus: new -> ready
2014-10-08 17:57:33adminsetmessages: + msg7133
2014-10-01 00:00:00admincreate