Namespaces
Variants

std::ranges:: end

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
ヘッダーで定義 <iterator>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */ end = /* unspecified */ ;

}
(C++20以降)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグネチャ
template < class T >

requires /* see below */

constexpr std:: sentinel_for < ranges:: iterator_t < T >> auto end ( T && t ) ;
(C++20以降)

範囲の終端を示すセンチネルを返します。

range-begin-end.svg

引数が左辺値であるか、または ranges:: enable_borrowed_range < std:: remove_cv_t < T >> true である場合、 ranges::end の呼び出しは 式等価 です:

  1. t + std:: extent_v < T > tが既知の境界を持つ配列型の場合。
  2. それ以外の場合、 decay-copy ( t. end ( ) ) (C++23まで) auto ( t. end ( ) ) (C++23以降) 、その式が有効であり、その型が std:: sentinel_for < ranges:: iterator_t < T >> をモデル化する場合。
  3. それ以外の場合、 decay-copy ( end ( t ) ) (C++23まで) auto ( end ( t ) ) (C++23以降) T がクラス型または列挙型であり、その式が有効で、変換後の型が std:: sentinel_for < ranges:: iterator_t < T >> をモデル化する場合。ここで end の意味は、 実引数依存の名前探索 のみを実行したかのように確立される。

それ以外のすべての場合において、 ranges::end の呼び出しは不適格となり、 置換失敗 を引き起こす可能性があります。これは、 ranges::end の呼び出しがテンプレートのインスタンス化の直接の文脈内に現れる場合に発生します。

目次

カスタマイゼーションポイントオブジェクト

名前 ranges::end カスタマイゼーションポイントオブジェクト を表し、これは 関数オブジェクト のconstな リテラル semiregular クラス型である。詳細は CustomizationPointObject を参照。

注記

引数が右辺値(すなわち T がオブジェクト型)であり、かつ ranges:: enable_borrowed_range < std:: remove_cv_t < T >> false である場合、または未知のサイズの配列型である場合、 ranges::end の呼び出しは不適格となり、これは置換失敗も引き起こします。

ranges :: end ( std:: forward < T > ( t ) ) が有効な場合、 decltype ( ranges :: end ( std:: forward < T > ( t ) ) ) decltype ( ranges:: begin ( std:: forward < T > ( t ) ) ) はあらゆる場合に std::sentinel_for をモデルし、 T std::ranges::range をモデルする。

C++20標準では、基となる end 関数呼び出しがprvalueを返す場合、戻り値は具体化された一時オブジェクトからムーブ構築されることが要求されます。すべての実装は代わりに直接prvalueを返します。この要件は、実装に合わせるためにポストC++20提案 P0849R8 によって修正されました。

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main()
{
    std::vector<int> vec{3, 1, 4};
    if (std::ranges::find(vec, 5) != std::ranges::end(vec))
        std::cout << "found a 5 in vector vec!\n";
    int arr[]{5, 10, 15};
    if (std::ranges::find(arr, 5) != std::ranges::end(arr))
        std::cout << "found a 5 in array arr!\n";
}

出力:

found a 5 in array arr!

欠陥報告

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

DR 適用対象 公開時の動作 正しい動作
P2602R2 C++20 特定の非メンバー end ADL によって見つけることを禁止する機構がある そのような機構を削除

関連項目

読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト)
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
(C++11) (C++14)
コンテナまたは配列の終端を指すイテレータを返す
(関数テンプレート)