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 /* see below */

constexpr /* see below */ cdata ( T && t ) ;
(C++20 이후)

연속 범위의 첫 번째 요소에 대한 포인터를 반환합니다. 상수 타입 (C++23부터) , const 한정된 (C++23 이전) 인수로 표시된.

CT 를 다음과 같이 정의한다

  • const std:: remove_reference_t < T > & 만약 인자가 lvalue인 경우(즉, T 가 lvalue 참조 타입인 경우),
  • 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 호출은 형식에 맞지 않으며, 이는 템플릿 인스턴스화의 직접적 문맥에서 호출이 나타날 때 치환 실패 를 초래할 수 있습니다.

(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'; // 오류, src.data()는 읽기 전용으로 처리됨
    std::ranges::data(src)[0] = 'H'; // 정상, src.data()는 비상수 저장소임
    char dst[20]; // C 스타일 문자열을 위한 저장소
    std::strcpy(dst, std::ranges::cdata(src));
    // [data(src), data(src) + size(src)]는 NTBS임이 보장됨
    std::cout << dst;
}

출력:

Hello world!

참고 항목

연속 범위의 시작 부분에 대한 포인터를 획득
(커스터마이제이션 포인트 객체)
(C++17)
기반 배열에 대한 포인터를 획득
(함수 템플릿)