426. search_n(), fill_n(), and generate_n() with negative n

Section: 28.5.13 [alg.search], 28.6.6 [alg.fill], 28.6.7 [alg.generate] Status: CD1 Submitter: Martin Sebor Opened: 2003-09-18 Last modified: 2016-02-10

Priority: Not Prioritized

View all other issues in [alg.search].

View all issues with CD1 status.

Discussion:

The complexity requirements for these function templates are incorrect (or don't even make sense) for negative n:

25.1.9, p7 (search_n):
Complexity: At most (last1 - first1) * count applications of the corresponding predicate.

25.2.5, p3 (fill_n):
Complexity: Exactly last - first (or n) assignments.

25.2.6, p3 (generate_n):
Complexity: Exactly last - first (or n) assignments.

In addition, the Requirements or the Effects clauses for the latter two templates don't say anything about the behavior when n is negative.

Proposed resolution:

Change 25.1.9, p7 to

Complexity: At most (last1 - first1) * count applications of the corresponding predicate if count is positive, or 0 otherwise.

Change 25.2.5, p2 to

Effects: Assigns value through all the iterators in the range [first, last), or [first, first + n) if n is positive, none otherwise.

Change 25.2.5, p3 to:

Complexity: Exactly last - first (or n if n is positive, or 0 otherwise) assignments.

Change 25.2.6, p1 to (notice the correction for the misspelled "through"):

Effects: Invokes the function object genand assigns the return value of gen through all the iterators in the range [first, last), or [first, first + n) if n is positive, or [first, first) otherwise.

Change 25.2.6, p3 to:

Complexity: Exactly last - first (or n if n is positive, or 0 otherwise) assignments.

Rationale:

Informally, we want to say that whenever we see a negative number we treat it the same as if it were zero. We believe the above changes do that (although they may not be the minimal way of saying so). The LWG considered and rejected the alternative of saying that negative numbers are undefined behavior.