Namespaces
Variants

std::ranges:: dangling

From cppreference.net
Ranges library
Range adaptors
헤더 파일에 정의됨 <ranges>
struct dangling ;
(C++20부터)

dangling 는 플레이스홀더 타입이자 빈 클래스 타입으로, 템플릿 별칭 ranges::borrowed_iterator_t ranges::borrowed_subrange_t 와 함께 사용됩니다.

특정 constrained algorithms 가 일반적으로 range 의 iterator나 subrange를 반환할 때, borrowed_range 를 모델링하지 않는 rvalue range 인자를 받는 경우, 잠재적으로 dangling될 수 있는 결과를 반환하는 것을 피하기 위해 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)
해당 타입이 range 임을 명시하며, 이로부터 얻은 반복자들이 댕글링(dangling) 위험 없이 안전하게 반환될 수 있음을 보장함
(concept)