- iterator[meta header]
- std[meta namespace]
- common_iterator[meta class]
- function[meta id-type]
- cpp20[meta cpp]
decltype(auto) operator->() const requires /*see below*/;
- see below[italic]
イテレータを間接参照する。
requires
節には以下の制約式が指定される。
indirectly_readable<const I> &&
(requires(const I& i) { i.operator->(); } ||
is_reference_v<iter_reference_t<I>> ||
constructible_from<iter_value_t<I>, iter_reference_t<I>>)
- indirectly_readable[link /reference/iterator/indirectly_readable.md]
- is_reference_v[link /reference/type_traits/is_reference.md]
- iter_reference_t[link /reference/iterator/iter_reference_t.md]
- constructible_from[link /reference/concepts/constructible_from.md]
- iter_value_t[link /reference/iterator/iter_value_t.md]
holds_alternative
<I>(v_) == true
I, S
の値のどちらかをvariant<I, S>
型のメンバ変数v_
に保持しているとして、次のいずれか
-
I
がポインタ型であり、get<I>(v_).operator->()
が呼び出し可能な場合 :return get<I>(v_);
-
iter_reference_t
<I>
が参照型の場合 : 以下と等価auto&& tmp = *get<I>(v_); return addressof(tmp);
- addressof[link /reference/memory/addressof.md]
-
それ以外の場合 :
return proxy(*get<I>(v_));
proxy
は次のように定義される説明専用のクラス。class proxy { iter_value_t<I> keep_; proxy(iter_reference_t<I>&& x) : keep_(std::move(x)) {} public: const iter_value_t<I>* operator->() const { return addressof(keep_); } };
- iter_reference_t[link /reference/iterator/iter_reference_t.md]
- iter_value_t[link /reference/iterator/iter_value_t.md]
- addressof[link /reference/memory/addressof.md]
- C++20
- Clang: ??
- GCC: 10.1 [mark verified]
- Visual C++: 2019 Update 9 [mark verified]