std::ranges:: view, std::ranges:: enable_view, std::ranges:: view_base
|
헤더 파일에 정의됨
<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
=
|
(2) | (C++20부터) |
|
struct
view_base
{
}
;
|
(3) | (C++20부터) |
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
타입을 가져야 합니다.
목차 |
의미론적 요구사항
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
타입의 예시는 다음과 같습니다:
-
반복자 쌍을 감싸는
range타입, 예를 들어 std :: ranges:: subrange < I > . -
요소들을
std::shared_ptr
으로 보유하고 모든 복사본과 소유권을 공유하는
range타입. -
요청 시 요소들을 생성하는
range타입, 예를 들어 std::ranges::iota_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 | 소멸자 시간 복잡도에 대한 제한이 너무 엄격함 | 완화됨 |