483. Heterogeneous equality and EqualityComparable

Section: 28.5 [alg.nonmodifying], 28.6 [alg.modifying.operations] Status: Dup Submitter: Peter Dimov Opened: 2004-09-20 Last modified: 2016-02-10

Priority: Not Prioritized

View all issues with Dup status.

Duplicate of: 283

Discussion:

c++std-lib-14262

[lib.alg.find] requires T to be EqualityComparable:

template <class InputIterator, class T>
   InputIterator find(InputIterator first, InputIterator last,
                      const T& value);

However the condition being tested, as specified in the Effects clause, is actually *i == value, where i is an InputIterator.

The two clauses are in agreement only if the type of *i is T, but this isn't necessarily the case. *i may have a heterogeneous comparison operator that takes a T, or a T may be convertible to the type of *i.

Further discussion (c++std-lib-14264): this problem affects a number of algorithsm in clause 25, not just find. We should try to resolve this problem everywhere it appears.

Proposed resolution:

[lib.alg.find]:

Remove [lib.alg.find]/1.

[lib.alg.count]:

Remove [lib.alg.count]/1.

[lib.alg.search]:

Remove "Type T is EqualityComparable (20.1.1), " from [lib.alg.search]/4.

[lib.alg.replace]:

Remove [lib.alg.replace]/1. Replace [lb.alg.replace]/2 with:

For every iterator i in the range [first, last) for which *i == value or pred(*i) holds perform *i = new_value.

Remove the first sentence of /4. Replace the beginning of /5 with:

For every iterator i in the range [result, result + (last - first)), assign to *i either...

(Note the defect here, current text says assign to i, not *i).

[lib.alg.fill]:

Remove "Type T is Assignable (23.1), " from /1. Replace /2 with:

For every iterator i in the range [first, last) or [first, first + n), perform *i = value.

[lib.alg.remove]:

Remove /1. Remove the first sentence of /6.

Rationale:

Duplicate of (a subset of) issue 283.