66 lines
2.5 KiB
Markdown
66 lines
2.5 KiB
Markdown
[common.iter.access]
|
||
|
||
# 24 Iterators library [[iterators]](./#iterators)
|
||
|
||
## 24.5 Iterator adaptors [[predef.iterators]](predef.iterators#common.iter.access)
|
||
|
||
### 24.5.5 Common iterators [[iterators.common]](iterators.common#common.iter.access)
|
||
|
||
#### 24.5.5.4 Accessors [common.iter.access]
|
||
|
||
[ð](#lib:operator*,common_iterator)
|
||
|
||
`constexpr decltype(auto) operator*();
|
||
constexpr decltype(auto) operator*() const
|
||
requires [dereferenceable](iterator.synopsis#concept:dereferenceable "24.2 Header <iterator> synopsis [iterator.synopsis]")<const I>;
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5623)
|
||
|
||
*Hardened preconditions*: holds_alternative<I>(v_) is true[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5627)
|
||
|
||
*Effects*: Equivalent to: return *get<I>(v_);
|
||
|
||
[ð](#lib:operator-%3e,common_iterator)
|
||
|
||
`constexpr auto operator->() const
|
||
requires see below;
|
||
`
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5639)
|
||
|
||
The expression in the [*requires-clause*](temp.pre#nt:requires-clause "13.1 Preamble [temp.pre]") is equivalent to:[indirectly_readable](iterator.concept.readable#concept:indirectly_readable "24.3.4.2 Concept indirectly_readable [iterator.concept.readable]")<const I> &&(requires(const I& i) { i.operator->(); } || is_reference_v<iter_reference_t<I>> ||[constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_from [concept.constructible]")<iter_value_t<I>, iter_reference_t<I>>)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5648)
|
||
|
||
*Hardened preconditions*: holds_alternative<I>(v_) is true[.](#4.sentence-1)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5652)
|
||
|
||
*Effects*:
|
||
|
||
- [(5.1)](#5.1)
|
||
|
||
If I is a pointer type or if the expressionget<I>(v_).operator->() is
|
||
well-formed, equivalent to: return get<I>(v_);
|
||
|
||
- [(5.2)](#5.2)
|
||
|
||
Otherwise, if iter_reference_t<I> is a reference type, equivalent to:auto&& tmp = *get<I>(v_);return addressof(tmp);
|
||
|
||
- [(5.3)](#5.3)
|
||
|
||
Otherwise, equivalent to:return *proxy*(*get<I>(v_)); where*proxy* is the exposition-only class:class *proxy* { iter_value_t<I> keep_; constexpr *proxy*(iter_reference_t<I>&& x): keep_(std::move(x)) {}public:constexpr const iter_value_t<I>* operator->() const noexcept {return addressof(keep_); }};
|