This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.
4318. Havehive::erase_if
reevaluate end()
to avoid UB
Section: 23.3.9.6 [hive.erasure] Status: New Submitter: Frank Birbacher Opened: 2025-08-16 Last modified: 2025-08-17
Priority: Not Prioritized
View all other issues in [hive.erasure].
View all issues with New status.
Discussion:
Background: https://github.com/cplusplus/draft/pull/8162
For 23.3.9.6 [hive.erasure] p2, the defining code must not cache the end-iterator. In case the last element of the sequence is removed, the past-the-end iterator will be invalidated. This will trigger UB in the loop condition. Instead, re-evaluateend()
each time.
Proposed resolution:
This wording is relative to N5014.
[Drafting note: There are other ways to fix this code while keeping the caching behaviour, but I don't see any particular reason to do so for the definition of the effects.]
Modify 23.3.9.6 [hive.erasure] as indicated:
template<class T, class Allocator, class Predicate> typename hive<T, Allocator>::size_type erase_if(hive<T, Allocator>& c, Predicate pred);-2- Effects: Equivalent to:
auto original_size = c.size(); for (auto i = c.begin(), last = c.end(); i != lastc.end(); ) { if (pred(*i)) { i = c.erase(i); } else { ++i; } } return original_size - c.size();
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4