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)
-
- borrowed_range 개념은 함수가 그것을 값으로 받아 그로부터 얻은 반복자를 매달림 위험 없이 반환할 수 있는 범위의 요구사항을 정의해요.
-
- 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을 반환).