sub_match::swap only swaps the base classSection: 28.6.8 [re.submatch] Status: C++23 Submitter: Jonathan Wakely Opened: 2019-05-07 Last modified: 2023-11-22
Priority: 3
View all other issues in [re.submatch].
View all issues with C++23 status.
Discussion:
sub_match<I> derives publicly from pair<I,I>, and so inherits
pair::swap(pair&). This means that the following program fails:
#include <regex>
#include <cassert>
int main()
{
std::sub_match<const char*> a, b;
a.matched = true;
a.swap(b);
assert(b.matched);
}
The pair::swap(pair&) member should be hidden by a sub_match::swap(sub_match&)
member that does the right thing.
[2019-06-12 Priority set to 3 after reflector discussion]
[2020-05-01; Daniel adjusts wording to recent working draft]
[2022-04-25; Daniel adjusts wording to recent working draft]
In addition the revised wording uses the new standard phrase "The exception specification is equivalent to"
Previous resolution [SUPERSEDED]:
This wording is relative to N4910.
Modify 28.6.8 [re.submatch], class template
sub_matchsynopsis, as indicated:template<class BidirectionalIterator> class sub_match : public pair<BidirectionalIterator, BidirectionalIterator> { public: […] int compare(const sub_match& s) const; int compare(const string_type& s) const; int compare(const value_type* s) const; void swap(sub_match& s) noexcept(see below); };Modify 28.6.8.2 [re.submatch.members] as indicated:
int compare(const value_type* s) const;[…]
void swap(sub_match& s) noexcept(see below);[Drafting note: The swappable requirement should really be unnecessary because Cpp17Iterator requires it, but there is no wording that requiresBidirectionalIteratorin Clause 28.6 [re] in general meets the bidirectional iterator requirements. Note that the definition found in 26.2 [algorithms.requirements] does not extend to 28.6 [re] normatively. — end drafting note]-?- Preconditions: Lvalues of type
-?- Effects: Equivalent to:BidirectionalIteratorare swappable (16.4.4.3 [swappable.requirements]).this->pair<BidirectionalIterator, BidirectionalIterator>::swap(s); std::swap(matched, s.matched);-?- Remarks: The exception specification is equivalent to
is_nothrow_swappable_v<BidirectionalIterator>.
[2022-11-06; Daniel comments and improves wording]
With the informal acceptance of P2696R0 by LWG during a pre-Kona telecon, we should use the new requirement set Cpp17Swappable instead of the "LValues are swappable" requirements.
[2022-11-30; Reflector poll]
Set status to Tentatively Ready after six votes in favour during reflector poll.
[2023-02-13 Approved at February 2023 meeting in Issaquah. Status changed: Voting → WP.]
Proposed resolution:
This wording is relative to N4917 and assumes the acceptance of P2696R0.
Modify 28.6.8 [re.submatch], class template sub_match synopsis, as indicated:
template<class BidirectionalIterator>
class sub_match : public pair<BidirectionalIterator, BidirectionalIterator> {
public:
[…]
int compare(const sub_match& s) const;
int compare(const string_type& s) const;
int compare(const value_type* s) const;
void swap(sub_match& s) noexcept(see below);
};
Modify 28.6.8.2 [re.submatch.members] as indicated:
int compare(const value_type* s) const;[…]
void swap(sub_match& s) noexcept(see below);[Drafting note: The Cpp17Swappable requirement should really be unnecessary because Cpp17Iterator requires it, but there is no wording that requiresBidirectionalIteratorin Clause 28.6 [re] in general meets the bidirectional iterator requirements. Note that the definition found in 26.2 [algorithms.requirements] does not extend to 28.6 [re] normatively. — end drafting note]-?- Preconditions:
-?- Effects: Equivalent to:BidirectionalIteratormeets the Cpp17Swappable requirements (16.4.4.3 [swappable.requirements]).this->pair<BidirectionalIterator, BidirectionalIterator>::swap(s); std::swap(matched, s.matched);-?- Remarks: The exception specification is equivalent to
is_nothrow_swappable_v<BidirectionalIterator>.