Skip to content

Latest commit

 

History

History
76 lines (61 loc) · 2.38 KB

op_arrow.md

File metadata and controls

76 lines (61 loc) · 2.38 KB

operator->

  • 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

処理系

参照