Namespaces
Variants

std::ranges::data

ja.cppreference.net より
 
 
範囲ライブラリ
範囲アダプタ
 
ヘッダ <ranges>
で定義ヘッダ <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ data = /* unspecified */;
}
で定義(C++20 から)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグニチャ
template< class T >
    requires /* see below */
constexpr std::remove_reference_t<
    ranges::range_reference_t<T>>* data( T&& t );
(C++20 から)

連続範囲の先頭要素へのポインタを返します。

T が配列型で std::remove_all_extents_t<std::remove_reference_t<T>> が不完全型である場合、ranges::data の呼び出しは ill-formed であり、診断は不要です。

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

  1. decay-copy(t.data())(C++23 まで)auto(t.data())(C++23 から)、その式が有効であり、その型がオブジェクト型へのポインタである場合。
  2. そうでなければ、std::to_address(ranges::begin(t))、式 ranges::begin(t) が有効であり、その型が std::contiguous_iterator のモデルである場合。

それ以外のすべての場合、ranges::data の呼び出しは ill-formed であり、 置換失敗 が生じる可能性があります(ranges::data(e) がテンプレートのインスタンス化の直接の文脈に現れる場合)。

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

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

注記

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

式 ranges :: data ( e ) が有効な場合、それはオブジェクトへのポインタを返します。

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

例

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // Cスタイル文字列用のストレージ
    std::strcpy(a, std::ranges::data(s));
    // [data(s), data(s) + size(s)] は NTBS であることが保証される
    std::cout << a;
}

出力:

Hello world!

関連項目

読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)
(C++17)
基となる配列へのポインタを取得する
(関数テンプレート)