ranges_borrowed_range

ranges_borrowed_range (빌린 범위 개념)

ranges::borrowed_range은 함수가 그것을 값으로 받아 그로부터 얻은 반복자를 매달림 없이 반환할 수 있는 범위의 요구사항을 정의하는 개념이에요. C++20부터 사용할 수 있어요.

출처: cppreference

본문

<ranges> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.

template< class R >
concept borrowed_range =
    ranges::range<R> &&
    (std::is_lvalue_reference_v<R> ||
     ranges::enable_borrowed_range<std::remove_cvref_t<R>>);

(1) (since C++20)

template< class R >
constexpr bool enable_borrowed_range = false;

(2) (since C++20)

    1. borrowed_range 개념은 함수가 그것을 값으로 받아 그로부터 얻은 반복자를 매달림 위험 없이 반환할 수 있는 범위의 요구사항을 정의해요.
    1. enable_borrowed_range 변수 템플릿은 범위가 borrowed_range인지를 나타내는 데 사용돼요. 기본값은 false지만, 사용자는 이런 범위를 표시하기 위해 cv 한정되지 않은 프로그램 정의 타입에 대해 true로 특수화할 수 있어요.

의미 요구사항 (Semantic requirements)

R이 borrowed_range를 모델링할 때:

  • R 타입의 rvalue r에 대해, r에서 얻은 반복자가 r의 수명을 넘어 유효할 수 있는 경우에만 그 반복자 사용이 안전해요.

참고 (Notes)

std::string_view, std::span 등 소유하지 않는 뷰와 배열 참조가 borrowed_range예요. 소유 컨테이너(std::vector 등)의 rvalue는 아니에요. 그렇기 때문에 반복자를 반환하는 비멤버 함수는 std::vector의 임시값을 받아 매달린 반복자를 반환하는 것을 컴파일 타임에 막을 수 있어요 (dangling을 반환).

더 알아보기 (Learn more)

cppreference