名前空間
変種
操作

std::ranges::data

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <ranges> で定義
ヘッダ <iterator> で定義
inline namespace /* 未指定 */ {

    inline constexpr /* 未定義 */ data = /* 未定義 */;

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

    requires /* 以下を参照 */
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以降), if that expression is valid and its type is a pointer to an object type. (その式が有効で、その型がオブジェクト型へのポインタである場合)。
  2. それ以外の場合は、std::to_address(ranges::begin(t))。ただし、式 ranges::begin(t) が有効であり、その型が std::contiguous_iterator をモデル化する場合。

上記以外の場合、ranges::data の呼び出しは ill-formed であり、テンプレートインスタンテーションの即時コンテキストで ranges::data(e) が現れると 置換失敗 を引き起こす可能性があります。

目次

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

ranges::data という名前は、定数 関数オブジェクトで、リテラル semiregular クラス型の *カスタマイズポイントオブジェクト* を指します。説明のために、その型の cv-修飾されていないバージョンを __data_fn と表記します。

__data_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __data_fn 型のインスタンスを呼び出す効果は、インスタンスを表す式が左辺値か右辺値か、また const 修飾されているかどうかに関わらず同等です (ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)。したがって、ranges::data は自由にコピーでき、そのコピーは相互に交換可能に使用できます。

型のセット Args... が与えられた場合、std::declval<Args>()... が上記の ranges::data への引数の要件を満たす場合、__data_fn は以下をモデル化します。

それ以外の場合、__data_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] 注記

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

e に対して 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]; // storage for a C-style string
    std::strcpy(a, std::ranges::data(s));
    // [data(s), data(s) + size(s)] is guaranteed to be an NTBS
 
    std::cout << a;
}

出力

Hello world!

[編集] 関連項目

読み取り専用の連続rangeの先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)[編集]
rangeの先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト)[編集]
(C++17)
背後にある配列へのポインタを取得する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)