This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.
std::optional<T&>::iterator
can't be a contiguous iterator for some T
Section: 22.5.4.5 [optional.ref.iterators] Status: New Submitter: Jiang An Opened: 2025-08-05 Last modified: 2025-08-09
Priority: Not Prioritized
View all issues with New status.
Discussion:
This is related to LWG 4304(i). When T
is function type or an incomplete array type,
it is impossible to implement all requirements in 22.5.4.5 [optional.ref.iterators]/1.
T
is an incomplete object type, we may want to support std::optional<T&>
as it's sometimes a replacement of T*
. Perhaps we can require that the iterator type is always a
random access iterator, and additional models contiguous_iterator
when T
is complete.
When T
is a function type, the possibly intended iterator would be not even an actual iterator.
But it seems that range-for loop over such an std::optional<T&>
can work.
Proposed resolution:
This wording is relative to this CD preview draft.
Modify 22.5.4.5 [optional.ref.iterators] as indicated:
using iterator = implementation-defined;-1-
-?- IfTIfT
is an object type, this type modelscontiguous_iterator
(24.3.4.14 [iterator.concept.contiguous])random_access_iterator
(24.3.4.13 [iterator.concept.random.access]), meets the Cpp17RandomAccessIterator requirements (24.3.5.7 [random.access.iterators]), and meets the requirements for constexpr iterators (24.3.1 [iterator.requirements.general]), with value typeremove_cv_t<T>
. The reference type isT&
foriterator
. WhenT
is a complete object type, iterator additionally modelscontiguous_iterator
(24.3.4.14 [iterator.concept.contiguous]).
-2-All requirements on container iterators (23.2.2.2 [container.reqmts]) apply tooptional::iterator
.T
is a function type,iterator
supports all operators required by therandom_access_iterator
concept (24.3.4.13 [iterator.concept.random.access]) along with the<=>
operator as specified for container iterators (23.2.2.2 [container.reqmts]).iterator
dereferences to aT
lvalue. These operators behave as ifiterator
were an actual iterator iterating over a range ofT
, and result in constant subexpressions whenever the behavior is well-defined. [Note ?: Such anoptional::iterator
does not need to declare any member type because it is not an actual iterator type. — end note]