Section: 26.6 [alg.nonmodifying], 26.7 [alg.modifying.operations] Status: Dup Submitter: Peter Dimov Opened: 2004-09-20 Last modified: 2016-01-28
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.