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

### 2688. `clamp` misses preconditions and has extraneous condition on result

Section: 25.8.10 [alg.clamp] Status: C++17 Submitter: Martin Moene Opened: 2016-03-23 Last modified: 2017-07-30

Priority: 0

View all issues with C++17 status.

Discussion:

In Jacksonville (2016), P0025R0 was voted in instead of the intended P0025R1. This report contains the necessary mending along with two other improvements.

This report:

- adds the precondition that misses from P0025R0 but is in P0025R1,

- corrects the returns: specification that contains an extraneous condition,

- replaces the now superfluous remark with a note on usage of clamp with `float` or `double`.

Thanks to Carlo Assink and David Gaarenstroom for making us aware of the extraneous condition in the returns: specification and for suggesting the fix and to Jeffrey Yasskin for suggesting to add a note like p3.

Previous resolution [SUPERSEDED]:

> 1. Edit 25.8.10 [alg.clamp] as indicated:

>    >     template<class T>
>    >       constexpr const T& clamp(const T& v, const T& lo, const T& hi);
>    >     template<class T, class Compare>
>    >       constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp);

>    > > -1- Requires: The value of `lo` shall be no greater than `hi`. For the first form, type `T` shall be `LessThanComparable` (Table 18).

>    > > -2- Returns: `lo` if `v` is less than `lo`, `hi` if `hi` is less than `v`, otherwise `v` The larger value of `v` and `lo` if `v` is smaller than `hi`, otherwise the smaller value of `v` and `hi`.

>    > > -3- Note Remarks: If NaN is avoided, `T` can be `float` or `double` Returns the first argument when it is equivalent to one of the boundary arguments.

>    > > -4- Complexity: At most two comparisons.

[2016-05 Issues Telecon]

Reworded p3 slightly.

Proposed resolution:

This wording is relative to N4582.

1. Edit 25.8.10 [alg.clamp] as indicated:

   >     template<class T>
   >       constexpr const T& clamp(const T& v, const T& lo, const T& hi);
   >     template<class T, class Compare>
   >       constexpr const T& clamp(const T& v, const T& lo, const T& hi, Compare comp);

   > > -1- Requires: The value of `lo` shall be no greater than `hi`. For the first form, type `T` shall be `LessThanComparable` (Table 18).

   > > -2- Returns: `lo` if `v` is less than `lo`, `hi` if `hi` is less than `v`, otherwise `v` The larger value of `v` and `lo` if `v` is smaller than `hi`, otherwise the smaller value of `v` and `hi`.

   > > -3- Note Remarks: If NaN is avoided, `T` can be a floating point type Returns the first argument when it is equivalent to one of the boundary arguments.

   > > -4- Complexity: At most two comparisons.