编译器如何选择给哪个值auto

How does the compiler choose which value to give auto?

本文关键字:auto 选择 何选择 编译器      更新时间:2023-10-16

首先,我知道这是一个极其简单的问题。我只是在寻找一个技术上的解释,为什么编译器决定使以下变量与一个自动类型说明符double类型int:

int value1 = 5;
double value2 = 2.2;
auto value3 = value1 * value2;

我知道编译器将从初始值中派生出value3的双精度类型,但究竟是为什么呢?

auto变量类型是根据模板类型推导来定义的。这样的:

template<typename T>
void f(T t);
f(value1 * value2);  // will call f<double>()

value1 * value2给出double而不是int的原因是算术转换规则允许将int转换为double(反向转换也是隐式转换,但不是算术转换)。当在内置类型上使用运算符时,将应用通常的算术转换。

下面是标准第5节(表达式)中的规则:

许多期望操作数为算术或枚举类型的二元操作符以类似的方式引起转换并产生结果类型。目的是产生一个公共类型,这也是结果的类型。此模式称为常规算术转换,定义如下:

  • 如果两个操作数都是作用域枚举类型,则不执行转换;如果另一个操作数不具有相同的类型,则表达式是错误的。
  • 如果其中一个操作数为long double类型,则另一个操作数转换为long double类型。
  • 如果其中一个操作数为double,另一个操作数转换为double
  • 如果其中一个操作数为float,另一个操作数转换为float
  • 否则,两个操作数都要进行积分提升。

因为当int乘以double时,你得到double

C和c++编译器总是将基本数字类型提升为表达式中包含的最通用类型。因此,任何包含两个int值的表达式都会产生一个int,但如果其中一个操作数是double,则表达式值也将是double