std::ranges::cdata
| ヘッダ <ranges> で定義 |
||
| ヘッダ <iterator> で定義 |
||
| inline namespace /*unspecified*/ { inline constexpr /*unspecified*/ cdata = /*unspecified*/; |
(C++20以降) (カスタマイズポイントオブジェクト) |
|
| 呼び出しシグネチャ |
||
| template< class T > requires /* 以下を参照 */ |
(C++20以降) | |
contiguous range の先頭要素へのポインタを返します。引数は const 修飾された(C++23 まで) range です。
|
戻り値の型は std::remove_reference_t<ranges::range_reference_t<CT>>* と同等です。 |
(C++23まで) |
|
引数が lvalue であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>> が true の場合、 戻り値の型は std::remove_reference_t<ranges::range_const_reference_t<T>>* と同等です。 それ以外の場合、 |
(C++23から) |
ranges::cdata(t) が有効な場合、constant type(C++23 以降) のオブジェクトへのポインタを返します。
カスタマイゼーションポイントオブジェクト
ranges::cdata という名前は、*customization point object* を表します。これは、FunctionObject の const な、literal で semiregular なクラス型のオブジェクトです。説明のため、cv-unqualified な型は __cdata_fn と表記します。
__cdata_fn のすべてのインスタンスは等価です。同じ引数に対して異なる __cdata_fn 型のインスタンスを呼び出した場合の効果は、インスタンスを表す式が lvalue か rvalue か、const 修飾されているかどうかに関わらず同等です(ただし、volatile 修飾されたインスタンスの呼び出しは保証されません)。したがって、ranges::cdata は自由にコピーでき、そのコピーは相互に交換可能に使用できます。
型 Args... のセットが与えられた場合、std::declval<Args>()... が上記の ranges::cdata への引数の要件を満たす場合、__cdata_fn は以下をモデル化します:
- std::invocable<__cdata_fn, Args...>,
- std::invocable<const __cdata_fn, Args...>,
- std::invocable<__cdata_fn&, Args...>、および
- std::invocable<const __cdata_fn&, Args...>.
それ以外の場合、__cdata_fn の関数呼び出し演算子のいずれもオーバーロード解決に参加しません。
[編集] Example
#include <cstring> #include <iostream> #include <ranges> #include <string> int main() { std::string src {"hello world!\n"}; // std::ranges::cdata(src)[0] = 'H'; // error, src.data() is treated as read-only std::ranges::data(src)[0] = 'H'; // OK, src.data() is a non-const storage char dst[20]; // storage for a C-style string std::strcpy(dst, std::ranges::cdata(src)); // [data(src), data(src) + size(src)] is guaranteed to be an NTBS std::cout << dst; }
出力
Hello world!
[編集] See also
| (C++20) |
連続rangeの先頭へのポインタを取得する (カスタマイゼーションポイントオブジェクト) |
| (C++17) |
背後にある配列へのポインタを取得する (function template) |