Namespaces
Variants

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

From ja.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) 現在の要素への参照、またはprvalue一時オブジェクト。 * 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++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3574 C++20 variant は完全なconstexpr(P2231R1)であったが、 common_iterator はそうではなかった 同様にconstexpr化
LWG 3595 C++20 プロキシ型の関数にconstexprとnoexceptが欠如していた 追加
LWG 3672 C++20 operator-> が通常の場合に参照を返す可能性があった 常に値で返す

関連項目

common_iteratorを新しく構築する
(public member function)