Namespaces
Variants

std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <ranges>
template < class T >
concept view = ranges:: range < T > && std:: movable < T > && ranges :: enable_view < T > ;
(1) (C++20부터)
template < class T >

constexpr bool enable_view =

std:: derived_from < T, view_base > || /*is-derived-from-view-interface*/ < T > ;
(2) (C++20부터)
struct view_base { } ;
(3) (C++20부터)
1) view 개념은 범위 어댑터 파이프라인을 구성하는 데 사용하기에 적합한 의미론적 속성을 가진 range 타입의 요구 사항을 명시합니다.
2) enable_view 변수 템플릿은 range view 인지 여부를 나타내는 데 사용됩니다. /*is-derived-from-view-interface*/ < T > T 가 어떤 타입 U 에 대해 정확히 하나의 public 기본 클래스 ranges:: view_interface < U > 를 가지고, 다른 타입 V 에 대해 ranges:: view_interface < V > 타입의 기본 클래스를 가지지 않는 경우에만 true 입니다.
사용자는 view 를 모델링하는 cv-unqualified 프로그램 정의 타입에 대해 enable_view true 로, 그렇지 않은 타입에 대해서는 false 로 특수화할 수 있습니다. 이러한 특수화는 상수 표현에서 사용 가능 해야 하며 const bool 타입을 가져야 합니다.
3) view_base 에서 파생하는 것은 range 타입이 view 를 모델링할 수 있게 합니다.

목차

의미론적 요구사항

1) T view 를 모델링하기 위한 조건:
  • T 의 이동 생성(move construction)이 상수 시간 복잡도를 가져야 하며,
  • T 객체가 M 개의 요소를 보유하고 있을 때, N 번의 복사 및/또는 이동이 발생하면, 이 N 개의 객체가 𝓞(N+M) 의 소멸 시간 복잡도를 가져야 합니다(이는 이동된 view 객체가 𝓞(1) 의 소멸 시간 복잡도를 가짐을 의미합니다). 그리고
  • std:: copy_constructible < T > false 이거나, T 의 복사 생성(copy construction)이 상수 시간 복잡도를 가져야 하며,
  • std:: copyable < T > false 이거나, T 의 복사 할당(copy assignment)이 소멸 후 복사 생성보다 시간 복잡도가 높지 않아야 합니다.

특수화

다음 표준 템플릿들의 모든 특수화에 대한 enable_view 특수화는 true 로 정의됩니다:

(C++26부터)

참고 사항

view 타입의 예시는 다음과 같습니다:

복사 가능한 컨테이너(예: std:: vector < std:: string > )는 일반적으로 컨테이너를 복사할 때 모든 요소를 복사하므로 상수 시간 내에 수행할 수 없어 view 의 의미론적 요구사항을 충족하지 않습니다.

뷰는 원래 저렴하게 복사 가능하고 소유권이 없는 범위로 설명되었지만, 어떤 타입이 view 를 모델링하기 위해 반드시 복사 가능하거나 소유권이 없을 필요는 없습니다. 그러나 여전히 (복사 가능한 경우) 복사, 이동, 할당, 파괴가 저렴해야 하며, 이는 범위 어댑터 가 예기치 않은 복잡도를 가지지 않도록 하기 위함입니다.

기본적으로, movable range 를 모델링하는 타입은 view_base 로부터 공개적이고 명확하게 파생되었거나, std::ranges::view_interface 의 정확히 하나의 특수화로부터 파생된 경우 뷰로 간주됩니다.

예제

최소 뷰.

#include <ranges>
struct ArchetypalView : std::ranges::view_interface<ArchetypalView>
{
    int* begin();
    int* end();
};
static_assert(std::ranges::view<ArchetypalView>);

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2325R3 C++20 view default_initializable 을 요구함 요구하지 않음
LWG 3549 C++20 enable_view view_interface 로부터의 상속을 감지하지 못함 감지함
P2415R2 C++20 소멸자 시간 복잡도에 대한 제한이 너무 엄격함 완화됨