This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD Editorial status.

684. Unclear which members of match_results should be used in comparison

Section: 28.6.9 [re.results] Status: NAD Editorial Submitter: Nozomu Katoo Opened: 2007-05-27 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [re.results].

View all issues with NAD Editorial status.

Discussion:

In 28.6.3 [re.syn] of N2284, two template functions are declared here:

// 28.10, class template match_results: 
  <snip>
// match_results comparisons 
  template <class BidirectionalIterator, class Allocator> 
    bool operator== (const match_results<BidirectionalIterator, Allocator>& m1, 
                     const match_results<BidirectionalIterator, Allocator>& m2); 
  template <class BidirectionalIterator, class Allocator> 
    bool operator!= (const match_results<BidirectionalIterator, Allocator>& m1, 
                     const match_results<BidirectionalIterator, Allocator>& m2); 

// 28.10.6, match_results swap:

But the details of these two bool operator functions (i.e., which members of match_results should be used in comparison) are not described in any following sections.

[ John adds: ]

That looks like a bug: operator== should return true only if the two objects refer to the same match - ie if one object was constructed as a copy of the other.

[ Kona (2007): Bill and Pete to add minor wording to that proposed in N2409. ]

Proposed resolution:

Add a new section after 28.6.9.8 [re.results.swap], which reads:

28.10.7 match_results non-member functions.

template<class BidirectionalIterator, class Allocator> 
  bool operator==(const match_results<BidirectionalIterator, Allocator>& m1, 
                  const match_results<BidirectionalIterator, Allocator>& m2);

Returns: true only if the two objects refer to the same match.

template<class BidirectionalIterator, class Allocator> 
  bool operator!=(const match_results<BidirectionalIterator, Allocator>& m1, 
                  const match_results<BidirectionalIterator, Allocator>& m2);

Returns: !(m1 == m2).

template<class BidirectionalIterator, class Allocator> 
  void swap(match_results<BidirectionalIterator, Allocator>& m1, 
            match_results<BidirectionalIterator, Allocator>& m2);

Returns: m1.swap(m2).

[ Bellevue: Proposed wording now in WP. ]