std::ranges::dangling
cppreference.net에서
| 헤더에 정의됨 <ranges>
|
||
struct dangling;
|
(C++20부터) | |
dangling은(는) 플레이스홀더 타입이자 빈 클래스 타입으로, 템플릿 별칭 ranges::borrowed_iterator_t 및 ranges::borrowed_subrange_t와 함께 사용됩니다.
일부 제약 알고리즘이 일반적으로 범위의 반복자 또는 하위 범위를 반환하는데, 특정 우측값 range 인수가 borrowed_range를 모델링하지 않을 경우, 잠재적으로 댕글링 결과를 반환하는 것을 피하기 위해 dangling가 대신 반환됩니다.
멤버 함수
std::ranges::dangling:: dangling
|
constexpr
dangling
(
)
noexcept
=
default
;
|
(1) | |
|
template
<
class
...
Args
>
constexpr dangling ( Args && ... ) noexcept { } |
(2) | |
1)
dangling
은 사소하게 기본 생성 가능합니다.
2)
dangling
은 임의의 개수와 임의의 non-void 타입 인수들로부터 생성될 수 있습니다. 이 생성 작업 자체는 어떠한 부수 효과도 가지지 않습니다.
다시 말해, 올바른 형태의 비집계 초기화에서 타입(예: 반복자 타입)을
dangling
으로 대체한 후에도, 결과적인 초기화는 여전히 올바른 형태를 유지합니다.
예제
이 코드 실행
#include <algorithm> #include <array> #include <iostream> #include <ranges> #include <type_traits> #include <string_view> int main() { auto get_array_by_value = [] { return std::array{0, 1, 0, 1}; }; auto dangling_iter = std::ranges::max_element(get_array_by_value()); static_assert(std::is_same_v<std::ranges::dangling, decltype(dangling_iter)>); // std::cout << *dangling_iter << '\n'; // 컴파일 오류: 'operator*'에 대한 일치 없음 // (피연산자 타입은 'std::ranges::dangling') auto get_persistent_array = []() -> const std::array<int, 4>& { static constexpr std::array a{0, 1, 0, 1}; return a; }; auto valid_iter = std::ranges::max_element(get_persistent_array()); static_assert(!std::is_same_v<std::ranges::dangling, decltype(valid_iter)>); std::cout << *valid_iter << ' '; // 1 auto get_string_view = [] { return std::string_view{"alpha"}; }; auto valid_iter2 = std::ranges::min_element(get_string_view()); // OK: std::basic_string_view는 borrowed_range를 모델링함 static_assert(!std::is_same_v<std::ranges::dangling, decltype(valid_iter2)>); std::cout << '\'' << *valid_iter2 << '\'' << '\n'; // 'a' }
출력:
1 'a'
참고 항목
borrowed_range
의 반복자 타입 또는
subrange
타입을 획득함
(alias template) |
|
|
(C++20)
|
해당 타입이
range
임을 명시하며, 이로부터 얻은 반복자들이 댕글링(dangling) 위험 없이 안전하게 반환될 수 있음을 보장함
(concept) |