Namespaces
Variants

std:: iterator_traits <std::counted_iterator>

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)
ヘッダーで定義 <iterator>
template < std:: input_iterator I >

requires /* 下記参照 */
struct iterator_traits < std:: counted_iterator < I >> : std:: iterator_traits < I > {
using pointer = std:: conditional_t < std:: contiguous_iterator < I > ,
std:: add_pointer_t < std:: iter_reference_t < I >> ,
void > ;

} ;
(C++20以降)

カスタマイズされた(標準の部分特殊化またはプログラム定義の特殊化から生成された)プロパティを継承し、 std:: iterator_traits < I > から、メンバ型 pointer が調整されます。ここで I input_iterator をモデル化します。

特に、 iterator_concept (存在する場合)と iterator_category std:: iterator_traits < I > から継承されます。

requires節の条件は、 true である場合に限り、 std:: iterator_traits < I > がプライマリテンプレートから生成されない場合です。

目次

注記

P2259R1 以前は、 std:: iterator_traits < I > がプライマリテンプレートから生成される場合でも、この特殊化が使用されていました。その結果、 std:: counted_iterator < I > をイテレータコンセプト(例: forward_iterator )に対してテストする際に、 /*ITER_CONCEPT*/ の決定が I::iterator_concept を考慮せず、したがって std:: counted_iterator < I > がそのコンセプトをモデル化できないかのように誤動作することがありました。この誤った動作は、libstdc++ 10.4以前およびMSVC STL VS 2022 17.0 Preview 3以前で実装されています。

標準ライブラリは、ポインタ型、 std::iterator_traits std::counted_iterator 、および std::common_iterator に対する部分特殊化を提供します。

#include <iterator>
#include <list>
#include <type_traits>
#include <vector>
int main()
{
    std::vector v{1, 2, 3, 4};
    std::list l{1, 2, 3, 4};
    std::counted_iterator iv{v.begin(), 3};
    std::counted_iterator il{l.begin(), 3};
    static_assert(std::is_same<int*, std::iterator_traits<decltype(iv)>::pointer>());
    static_assert(std::is_same<void, std::iterator_traits<decltype(il)>::pointer>());
}

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2259R1 C++20 requires節が存在しない
pointer は無条件に void として定義される
制約が追加された

関連項目

イテレータのプロパティに対する統一インターフェースを提供する
(クラステンプレート)