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

来自cppreference.com
 
 
迭代器库
迭代器概念
迭代器原语
算法概念与工具
间接可调用概念
常用算法要求
工具
迭代器适配器
流迭代器
迭代器定制点
迭代器操作
(C++11)
(C++11)
范围访问
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
std::common_iterator
成员函数
common_iterator::operator*common_iterator::operator->
(C++20)(C++20)
非成员函数
(C++20)
(C++20)
(C++20)
(C++20)
辅助类
 
constexpr decltype(auto) operator*();
(1) (C++20 起)
constexpr decltype(auto) operator*() const
    requires /*dereferenceable*/<const I>;
(2) (C++20 起)
constexpr 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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3574 C++20 variant 为完全 constexpr (P2231R1) 但 common_iterator 不是 亦使之为 constexpr
LWG 3595 C++20 代理类型的函数缺少 constexpr 与 noexcept 已添加
LWG 3672 C++20 operator-> 可以在常用情况下按引用返回 始终按值返回

参阅

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