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

### 2079. Required `pow()` overloads

Section: 28.7 [c.math] Status: NAD Submitter: Steve Clamage Opened: 2011-08-29 Last modified: 2016-01-28

Priority: 3

View all other issues in [c.math].

View all issues with NAD status.

Discussion:

LWG issue 550 removed the functions:

>     float       pow(float, int);
>     double      pow(double, int);
>     long double pow(long double, int);

from header `<cmath>`. This change does not seem to be mentioned in Annex C, C.2.14.

Howard:

> N3290 28.7 [c.math]/p11 says:

> > Moreover, there shall be additional overloads sufficient to ensure:

> > 1. If any argument corresponding to a `double` parameter has type `long double`, then all arguments corresponding to `double` parameters are effectively cast to `long double`.
> > 2. Otherwise, if any argument corresponding to a `double` parameter has type `double` or an integer type, then all arguments corresponding to `double` parameters are effectively cast to `double`.
> > 3. Otherwise, all arguments corresponding to `double` parameters are effectively cast to `float`.

> From C99 7.12.7.4 we have:

> >     double pow(double, double);

> 28.7 [c.math]/p11/b2 says that if the client calls `pow(2.0f, 2)`, then the `int` for second argument causes the following effective call to be made:

> >     pow(static_cast<double>(2.0f), static_cast<double>(2)) -> double

> The first sentence of p11 implies that this is done by supplying the following additional overload:

> >     double pow(float, int);

> If the client calls `pow(2.0, 2)`, then the same reasoning (b2 again) implies the following additional overload:

> >     double pow(double, int);

> If the client calls `pow(2.0l, 2)`, then b1 implies the following additional overload:

> >     long double pow(long double, int);

> In all, p11 implies hundreds (perhaps thousands?) of extra overloads. All but one of which is a superset of the overloads required by C++98/03 (that one being `pow(float, int)` which had its return type changed from `float` to `double`).

> In practice, at least some vendors implement p11 by using templated overloads as opposed to ordinary overloads.

Steve Clamage:

> Thanks. I didn't see that those extra overloads were actually implied by p11, despite the first sentence. Without examples, the point is a bit subtle (at least for me).

[2015-05-05 Lenexa: Move to NAD]

Billy: I believe this is NAD.

STL: Oh, Steve himself agrees.

Wakely: The issue marked as NAD will be sufficient.

STL: Yes, we should get rid of this.

Billy: I don't see any minutes from Issaquah.

Marshall: Since Steve agrees, does anyone object to marking as NAD?

Nope.

Proposed resolution: