# std::common_iterator<I,S>::operator*,->

< cpp‎ | iterator‎ | common iterator

constexpr decltype(auto) operator*(); | (1) | (C++20 起)
constexpr decltype(auto) operator*() const requires /*dereferenceable*/<const I>; | (2) | (C++20 起)
constexpr decltype(auto) operator->() const requires /* see description */; | (3) | (C++20 起)
辅助类型 |  |
class /*proxy*/ { // 仅用于阐释 std::iter_value_t<I> keep_; constexpr proxy(std::iter_reference_t<I>&& x) : keep_(std::move(x)) {} public: constexpr const std::iter_value_t<I>* operator->() const noexcept { return std::addressof(keep_); } }; | (4) | (C++20 起)

返回指向当前元素的指针或引用，或保有它的代理。

若底层 std::variant 成员对象 `var` 不保有 `I` 类型对象，即 std::holds_alternative<I>(var) 等于 false 则行为未定义。

令 `it` 代表 `var` 所保有的 `I` 类型迭代器，即 std::get<I>(var) 。

1-2) 返回解引用 `it` 的结果。
3) 返回指向当前元素的指针或底层迭代器，或保有它的代理：

- 等价于 return it; ，若 `I` 为指针类型或若表达式 it.operator->() 为良构，
- 否则等价于 auto&& tmp = *it; return std::addressof(tmp); ，若 std::iter_reference_t<I> 为引用类型，
- 否则等价于 return proxy(*it); ，其中 `proxy` 为仅用于阐释的类 (4) 。

`requires` 子句中的表达式等价于
std::indirectly_readable<const I> && (

requires(const I& i) { i.operator->(); } ||
std::is_reference_v<std::iter_reference_t<I>> ||
std::constructible_from<std::iter_value_t<I>, std::iter_reference_t<I>>

).

### 参数

（无）

### 返回值

1-2) 到当前元素的引用或纯右值临时量。等价于 *it 。
3) 前述的指向当前元素的指针或迭代器，或保有它的代理。

### 示例

    #include <algorithm>
    #include <complex>
    #include <iostream>
    #include <iterator>
    #include <initializer_list>
    using std::complex_literals::operator""i;
    int main() {
        const auto il = {1i,3.14+2i,3i,4i,5i};
        using CI = std::common_iterator<
            std::counted_iterator<decltype(il)::iterator>,
            std::default_sentinel_t>;
        CI ci { std::counted_iterator{
            std::next(begin(il), 1), ssize(il) - 1} };
        std::cout << *ci << ' ' << ci->real() << '\n';
    }

输出：

    (3.14,2) 3.14

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 3574 | C++20 | `variant` 为完全 constexpr (P2231R1) 但 `common_iterator` 不是 | 亦使之为 constexpr
LWG 3595 | C++20 | 代理类型的函数缺少 constexpr 与 noexcept | 已添加

### 参阅

(构造函数) (C++20) | 构造新的迭代器适配器 (公开成员函数)