Issue 2437: iterator_traits::reference can and can't be void (original) (raw)
This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++17 status.
2437. iterator_traits<OutIt>::reference can and can't be void
Section: 24.3.5.2 [iterator.iterators] Status: C++17 Submitter: Stephan T. Lavavej Opened: 2014-10-01 Last modified: 2017-07-30
Priority: 3
View all other issues in [iterator.iterators].
View all issues with C++17 status.
Discussion:
24.3.5.2 [iterator.iterators]/2 requires an Iterator's *r to return reference, i.e. iterator_traits<X>::reference according to 24.3.1 [iterator.requirements.general]/11.
24.3.5.4 [output.iterators]/1 requires an OutputIterator's *r = o to do its job, so *r clearly can't return void.
24.3.2.3 [iterator.traits]/1 says: "In the case of an output iterator, the types
iterator_traits::difference_type iterator_traits::value_type iterator_traits::reference iterator_traits::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 "
*rreturns unspecified" requirement, while 24.3.2.3 [iterator.traits]/1 clearly permits reference/etc. to bevoid. - Input-or-stronger iterators (whether constant or mutable) are unaffected — they still have to satisfy "
*rreturns reference", they're just getting that requirement fromInputIteratorinstead ofIterator.
[2015-02 Cologne]
EF: This is related to 2438(i). 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(i) is already Ready.
Proposed resolution:
This wording is relative to N3936.
- In 24.3.5.2 [iterator.iterators] Table 106 "Iterator requirements" change as indicated:
Table 106 — Iterator requirements
Expression Return type Operationalsemantics Assertion/note pre-/post-condition *r referenceunspecifiedpre: r is dereferenceable. … - In 24.3.5.3 [input.iterators] Table 107 "Input iterator requirements" change as indicated:
Table 107 — Input iterator requirements (in addition to Iterator)
Expression Return type Operationalsemantics Assertion/note pre-/post-condition … *a reference, convertible to T […] …