Namespaces
Variants

std::ranges::data

cppreference.net에서
 
 
범위 라이브러리
범위 어댑터
 
헤더에 정의됨 <ranges>
헤더에 정의됨 <iterator>
inline namespace /* unspecified */ {
    inline constexpr /* unspecified */ data = /* unspecified */;
}
(C++20부터)
(커스터마이제이션 포인트 객체)
호출 시그니처
template< class T >
    requires /* see below */
constexpr std::remove_reference_t<
    ranges::range_reference_t<T>>* data( T&& t );
(C++20부터)

연속 범위의 첫 번째 요소에 대한 포인터를 반환합니다.

만약 T이 배열 타입이고 std::remove_all_extents_t<std::remove_reference_t<T>>가 불완전한 경우, ranges::data 호출은 진단을 요구하지 않고 잘못된 형식입니다.

인수가 lvalue이거나 ranges::enable_borrowed_range<std::remove_cv_t<T>>가 true인 경우, ranges::data 호출은 표현식 등가입니다:

  1. decay-copy(t.data())(C++23까지)auto(t.data())(C++23부터), 해당 표현식이 유효하고 그 타입이 객체 타입에 대한 포인터인 경우.
  2. 그렇지 않으면, std::to_address(ranges::begin(t)), 만약 표현식 ranges::begin(t)이 유효하고 그 타입이 std::contiguous_iterator를 모델로 하는 경우.

다른 모든 경우에, ranges::data 호출은 잘못된 형식이며, 이로 인해 대체 실패는 ranges::data(e)이 템플릿 인스턴스화의 즉시 문맥에 나타날 때 발생할 수 있습니다.

커스터마이제이션 포인트 객체

이름 ranges::data 는 사용자 지정 지점 객체 를 나타내며, 이는 함수 객체 의 const 리터럴 semiregular 클래스 타입입니다. 자세한 내용은 CustomizationPointObject 를 참조하십시오.

참고 사항

인자가 rvalue(즉, T 가 객체 타입인 경우)이고 ranges:: enable_borrowed_range < std:: remove_cv_t < T >> 가 false 인 경우, ranges::data 호출은 형식이 잘못되어 치환 실패를 유발합니다.

만약 ranges :: data ( e ) 가 표현식 e 에 대해 유효하다면, 이는 객체에 대한 포인터를 반환합니다.

C++20 표준은 기본 data 함수 호출이 prvalue를 반환하는 경우, 반환 값이 구체화된 임시 객체에서 이동 생성되도록 요구합니다. 모든 구현체는 대신 prvalue를 직접 반환합니다. 이 요구사항은 구현체와 일치하도록 C++20 이후 제안서 P0849R8 에 의해 수정되었습니다.

예제

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // C-style 문자열을 위한 저장 공간
    std::strcpy(a, std::ranges::data(s));
    // [data(s), data(s) + size(s)]는 NTBS임이 보장됨
    std::cout << a;
}

출력:

Hello world!

참고 항목

읽기 전용 연속 범위의 시작 부분에 대한 포인터를 획득함
(customization point object)
범위의 시작 부분을 가리키는 반복자를 반환함
(customization point object)
(C++17)
기반 배열에 대한 포인터를 획득함
(function template)