[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  synopsis [iterator.synopsis]"); ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5623) *Hardened preconditions*: holds_alternative(v_) is true[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5627) *Effects*: Equivalent to: return *get(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]") &&(requires(const I& i) { i.operator->(); } || is_reference_v> ||[constructible_from](concept.constructible#concept:constructible_from "18.4.11 Concept constructible_­from [concept.constructible]"), iter_reference_t>) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/iterators.tex#L5648) *Hardened preconditions*: holds_alternative(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(v_).operator->() is well-formed, equivalent to: return get(v_); - [(5.2)](#5.2) Otherwise, if iter_reference_t is a reference type, equivalent to:auto&& tmp = *get(v_);return addressof(tmp); - [(5.3)](#5.3) Otherwise, equivalent to:return *proxy*(*get(v_)); where*proxy* is the exposition-only class:class *proxy* { iter_value_t keep_; constexpr *proxy*(iter_reference_t&& x): keep_(std::move(x)) {}public:constexpr const iter_value_t* operator->() const noexcept {return addressof(keep_); }};