名前空間
変種
操作

std::ranges::cdata

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

    inline constexpr /*unspecified*/ cdata = /*unspecified*/;

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

    requires /* 以下を参照 */

constexpr /* see below */ cdata( T&& t );
(C++20以降)

contiguous range の先頭要素へのポインタを返します。引数は const 修飾された(C++23 まで) range です。

CT を次のようにします。

  • 引数が左辺値(つまり、T が左辺値参照型)の場合、const std::remove_reference_t<T>&
  • それ以外の場合、const T

ranges::cdata の呼び出しは、ranges::data(static_cast<CT&&>(t)) と式等価です。

戻り値の型は std::remove_reference_t<ranges::range_reference_t<CT>>* と同等です。

(C++23まで)

引数が lvalue であるか、または ranges::enable_borrowed_range<std::remove_cv_t<T>>true の場合、ranges::cdata の呼び出しは以下と式等価です:

戻り値の型は std::remove_reference_t<ranges::range_const_reference_t<T>>* と同等です。

それ以外の場合、ranges::cdata の呼び出しは ill-formed であり、テンプレートインスタンス化の即時コンテキストで呼び出しが出現した場合、substitution failure を引き起こす可能性があります。

(C++23から)

ranges::cdata(t) が有効な場合、constant type(C++23 以降) のオブジェクトへのポインタを返します。

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

ranges::cdata という名前は、*customization point object* を表します。これは、FunctionObject の const な、literalsemiregular なクラス型のオブジェクトです。説明のため、cv-unqualified な型は __cdata_fn と表記します。

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

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

それ以外の場合、__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

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