Существует такая вещь, как «продвижение с плавающей запятой» от float
до double
на [conv.fpprom].
Значение prvalue типа float
можно преобразовать в значение prvalue типа double
. Значение не изменилось.
Это преобразование называется продвижением с плавающей запятой.
Ответы на связанный вопрос верны. Это преобразование не должно происходить автоматически при добавлении двух float
, поскольку обычные арифметические преобразования не продвигают операнды с плавающей запятой.
Повышение числа с плавающей запятой действительно происходит при передаче float
в качестве операнда многоточию, как в printf
. Вот почему спецификатор формата %f
печатает либо float
, либо double
: если вы передаете float
, функция фактически получает double
, результат повышения.
Существование продвижения с плавающей запятой также важно для устранения перегрузки, потому что интегральные повышения и повышения с плавающей запятой имеют более высокий ранг неявной конверсии, чем интегральные конверсии. , преобразования с плавающей запятой и преобразования с плавающей запятой.
Пример 1:
void f(double);
void f(long double);
f(0.0f);
Это вызывает void f(double)
, так как повышение до double
лучше, чем преобразование в long double
. Напротив, рассмотрим этот, возможно, удивительный пример 2:
void f(long double);
void f(int);
f(0.0f);
Это неоднозначно. Преобразование из float
в long double
не лучше, чем преобразование из float
в int
, поскольку оба они не являются рекламными акциями.
Пример 3:
struct S {
operator float();
operator int();
};
double d = S();
Это вызывает operator float
, а затем повышает полученное значение float
до double
для инициализации d
.
person
Brian Bi
schedule
27.05.2015