Namespaces
Variants

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

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
constexpr decltype ( auto ) operator * ( ) ;
(1) (自 C++20 起)
constexpr decltype ( auto ) operator * ( ) const
requires /*dereferenceable*/ < const I > ;
(2) (自 C++20 起)
constexpr auto operator - > ( ) const
requires /* 见描述 */ ;
(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) ( 仅用于说明* )

返回指向当前元素的指针或引用,或持有该元素的代理对象。

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

it 表示类型为 I 的迭代器,由 var 持有,即 std :: get < I > ( var )

1,2) 返回解引用 it 的结果。
3) 返回指向当前元素的指针或底层迭代器,或持有该元素的代理:
  • I 为指针类型,或表达式 it. operator - > ( ) 格式正确,则等价于 return it ;
  • 否则,若 std:: iter_reference_t < I > 为引用类型,则等价于 auto && tmp = * it ; return std:: addressof ( tmp ) ;
  • 否则,等价于 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 <complex>
#include <initializer_list>
#include <iostream>
#include <iterator>
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), std::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-> 在常规情况下可能返回引用 始终按值返回

参见

构造新的 common_iterator
(公开成员函数)