[FIX] gcc15: conditionally borrowed_range views #3360
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
gcc15 now implements
std::ranges::to
For
std::string
(as example), the call is delegated tostd::string(std::from_range, R &&)
.This then will use
std::ranges::data
to get the data pointer and just copy the data.This happens, for example, in format_sam's
id | detail::take_until_and_consume(is_space) | ranges::to<id_type>()
.Since the view is not an lvalue, it needs to be a borrowed_range for
std::ranges::data
to work.Similar to std::views, we make (some of) our views conditionally borrowed if the underlying range is borrowed.
Edit: The problem of calling
std::ranges::data
on non-borrowed ranges in thestd::string
range constructor is now also fixed in GCC. I was aware that this is likely a bug in GCC, but I found it worth making the views borrowed because it allows for optimizations (memcpy instead of iteration).