std::iterator_traits<std::counted_iterator>
| ヘッダ <iterator> で定義 |
||
| template< std::input_iterator I > requires /* 以下を参照 */ |
(C++20以降) | |
Iがinput_iteratorをモデルとする場合、カスタマイズされた(標準の部分特殊化またはプログラム定義の特殊化から生成された)std::iterator_traits<I>からプロパティを継承し、メンバ型pointerを調整します。
特に、iterator_concept(存在する場合)およびiterator_categoryは、std::iterator_traits<I>から継承されます。
requires節の条件は、std::iterator_traits<I>がプライマリテンプレートから生成されていない場合にのみtrueです。
目次 |
[編集] 注記
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::counted_iterator、およびstd::common_iterator のための std::iterator_traits の部分特殊化を提供します。
[編集] 例
#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として定義されます |
制約が追加された |
[編集] 関連項目
| イテレータのプロパティへの統一的なインターフェースを提供する (クラステンプレート) |