Namespaces
Variants

std::ranges::end

From ja.cppreference.net
 
 
Ranges library
Range adaptors
 
Defined in header <ranges>
Defined in header <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ end = /* unspecified */;
}
(since C++20)
(customization point object)
Call signature
template< class T >
    requires /* see below */
constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t );
(since C++20)

レンジの終端を示すセンチネルを返します。

引数が lvalue であるか ranges::enable_borrowed_range<std::remove_cv_t<T>>true である場合、ranges::end の呼び出しは以下に expression-equivalent です:

  1. t + std::extent_v<T> t が既知の境界を持つ配列型の場合。
    • std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型の場合、ranges::end の呼び出しは ill-formed であり、診断は不要です。
  2. そうでない場合、decay-copy(t.end())(until C++23)auto(t.end())(since C++23)、その式が有効であり、その型が std::sentinel_for<ranges::iterator_t<T>> をモデル化する場合。
  3. そうでない場合、decay-copy(end(t))(until C++23)auto(end(t))(since C++23)T がクラス型または列挙型であり、その式が有効で、変換後の型が std::sentinel_for<ranges::iterator_t<T>> をモデル化する場合。ここで end の意味は、argument-dependent lookup のみを実行したかのように確立されます。

それ以外のすべての場合、ranges::end の呼び出しは ill-formed であり、substitution failure を引き起こす可能性があります。これは 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)
コンテナまたは配列の終端を指すイテレータを返す
(関数テンプレート)