Namespaces
Variants

std::ranges::cdata

ja.cppreference.net より
 
 
範囲ライブラリ
範囲アダプタ
 
ヘッダ <ranges>
ヘッダ <iterator>
inline namespace /*unspecified*/ {
    inline constexpr /*unspecified*/ cdata = /*unspecified*/;
}
(C++20以上)
(カスタマイゼーションポイントオブジェクト)
呼び出しシグネチャ
template< class T >
    requires /* see below */
constexpr /* see below */ cdata( T&& t );
(C++20以上)

const修飾された引数によって示される連続範囲の最初の要素(定数型の)(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)
基となる配列へのポインタを取得する
(関数テンプレート)