名前空間
変種
操作

std::ranges::subrange の推論ガイド

From cppreference.com
< cpp‎ | ranges‎ | subrange
 
 
Rangesライブラリ
Rangeアダプタ
 
 
ヘッダ <ranges> で定義
template< std::input_or_output_iterator I, std::sentinel_for<I> S >
subrange(I, S) -> subrange<I, S>;
(1) (C++20以降)
template< std::input_or_output_iterator I, std::sentinel_for<I> S >

subrange(I, S, /*make-unsigned-like-t*/<std::iter_difference_t<I>>) ->

    subrange<I, S, ranges::subrange_kind::sized>;
(2) (C++20以降)
template< ranges::borrowed_range<R> >

subrange(R&&) ->
    subrange<ranges::iterator_t<R>, ranges::sentinel_t<R>,
             (ranges::sized_range<R> ||
              std::sized_sentinel_for<ranges::sentinel_t<R>,
              ranges::iterator_t<R>>) ?

             ranges::subrange_kind::sized : ranges::subrange_kind::unsized>;
(3) (C++20以降)
template< ranges::borrowed_range<R> >

subrange(R&&, /*make-unsigned-like-t*/<ranges::range_difference_t<R>>) ->
    subrange<ranges::iterator_t<R>, ranges::sentinel_t<R>,

             ranges::subrange_kind::sized>;
(4) (C++20以降)

これらの 推論ガイドstd::ranges::subrange のために提供されています。

1) イテレータとセンチネルの型からテンプレート引数を推論します。subrange は、デフォルトのテンプレート引数によって決定されるように、std::sized_sentinel_for<S, I> が満たされる場合にサイズ付きとなります。
2) イテレータとセンチネルの型からテンプレート引数を推論しますが、範囲のサイズが指定されます。subrange は常にサイズ付きとなります。
3) 範囲の型からテンプレート引数を推論します。範囲またはそのイテレータとセンチネルからサイズを取得できる場合、subrange はサイズ付きとなります。
4) 範囲の型からテンプレート引数を推論しますが、範囲のサイズが指定されます。subrange は常にサイズ付きとなります。

/* make-unsigned-like-t */ の定義については、make-unsigned-like-t を参照してください。

[編集] 注記

subrange オブジェクトを構築する際、

  • (1,2) の場合、イテレータとセンチネルのペアが有効な範囲を示さない場合、未定義の動作となります。
  • (2,4) の場合、指定されたサイズが範囲のサイズと等しくない場合、未定義の動作となります。

[編集]

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3404 C++20 ペアライクな型からの意味のない推論ガイドが提供されていました 削除
English 日本語 中文(简体) 中文(繁體)