std::ranges::data
| ヘッダ <ranges> で定義 |
||
| ヘッダ <iterator> で定義 |
||
| inline namespace /* 未指定 */ { inline constexpr /* 未定義 */ data = /* 未定義 */; |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(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 の呼び出しは、
- 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. (その式が有効で、その型がオブジェクト型へのポインタである場合)。
- それ以外の場合は、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 は以下をモデル化します。
- std::invocable<__data_fn, Args...>,
- std::invocable<const __data_fn, Args...>,
- std::invocable<__data_fn&, Args...>, and
- std::invocable<const __data_fn&, Args...>.
それ以外の場合、__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!
[編集] 関連項目
| (C++20) |
読み取り専用の連続rangeの先頭へのポインタを取得する (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
rangeの先頭を指すイテレータを返す (カスタマイゼーションポイントオブジェクト) |
| (C++17) |
背後にある配列へのポインタを取得する (function template) |