Namespaces
Variants

std::ranges:: cdata

From cppreference.net
Ranges library
Range adaptors
ヘッダーで定義 <ranges>
ヘッダーで定義 <iterator>
inline namespace /*unspecified*/ {

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

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

requires /* 下記参照 */

constexpr /* 下記参照 */ cdata ( T && t ) ;
(C++20以降)

連続した範囲の先頭要素へのポインタを返す。 定数型 (C++23以降) で示される範囲は、 const修飾された (C++23以前) 引数によって指定される。

CT を次のように定義する:

  • const std:: remove_reference_t < T > & 引数が左辺値の場合(すなわち T が左辺値参照型の場合)、
  • const T それ以外の場合。

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

戻り値の型は std:: remove_reference_t < ranges:: range_reference_t < CT >> * と等価である。

(C++23まで)

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

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

それ以外の場合、 ranges::cdata の呼び出しは不適格であり、テンプレートのインスタンス化の直接の文脈で呼び出しが現れる場合、 置換失敗 を引き起こす可能性があります。

(C++23以降)

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

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

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

#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!

関連項目

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