This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++23 status.
safe_range<SomeRange&> caseSection: 25.4.2 [range.range] Status: C++23 Submitter: Johel Ernesto Guerrero Peña Opened: 2019-12-19 Last modified: 2023-11-22
Priority: 3
View all other issues in [range.range].
View all issues with C++23 status.
Discussion:
25.5.5 [range.dangling] p2 hints at how safe_range should allow lvalue ranges to model it.
However, its wording doesn't take into account that case.
[2020-01 Priority set to 3 after review on the reflector.]
Previous resolution [SUPERSEDED]:
This wording is relative to N4842.
Modify 25.4.2 [range.range] as indicated:
template<class T> concept safe_range = range<T> && (is_lvalue_reference_v<T> || enable_safe_range<remove_cvref_t<T>>);-5-
Given an expressionA typeEsuch thatdecltype((E))isT,Tmodelssafe_rangeonlyif:-6- [Note:
(5.1) —
is_lvalue_reference_v<T>istrue, or(5.2) — given an expression
Esuch thatdecltype((E))isT,ifthe validity of iterators obtained from the object denoted byEis not tied to the lifetime of that object.Since the validity of iterators is not tied to the lifetime of an object whose type modelsA function can accept arguments ofsafe_range, asucha type that modelssafe_rangeby valueand return iterators obtained from it without danger of dangling. — end note]
[2021-05-19 Tim updates wording]
The new wording below attempts to keep the "borrowed" property generally
applicable to all models of borrowed_range, instead of bluntly carving
out lvalue reference types.
[2021-09-20; Reflector poll]
Set status to Tentatively Ready after five votes in favour during reflector poll in June.
[2021-10-14 Approved at October 2021 virtual plenary. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4885.
Modify 25.4.2 [range.range] as indicated:
template<class T> concept borrowed_range = range<T> && (is_lvalue_reference_v<T> || enable_borrowed_range<remove_cvref_t<T>>);-5- Let
-6- [Note: Since the validity of iterators is not tied to the lifetime ofUberemove_reference_t<T>ifTis an rvalue reference type, andTotherwise. Givenan expressiona variableEsuch thatdecltype((E))isTuof typeU,Tmodelsborrowed_rangeonly if the validity of iterators obtained fromthe object denoted byu is not tied to the lifetime of thatEobjectvariable.an objecta variable whose type modelsborrowed_range, a functioncan accept arguments ofwith a parameter of such a typeby value andcan return iterators obtained from it without danger of dangling. — end note]