编译器如何选择赋予auto的值?

Cod*_*bie 3 c++ double int auto

首先,我知道这是一个非常简单的问题.我只是在寻找技术解释,为什么编译器决定使用类型为double over int的自动类型说明符来生成以下变量:

int value1 = 5;
double value2 = 2.2;
auto value3 = value1 * value2;
Run Code Online (Sandbox Code Playgroud)

我知道编译器会从初始值派生value3的double类型,但为什么呢?

Ben*_*igt 5

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

template<typename T>
void f(T t);

f(value1 * value2);  // will call f<double>()
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 如果任一操作数是作用域枚举类型,则不执行任何转换; 如果另一个操作数的类型不同,则表达式格式不正确.
  • 如果任一操作数是类型long double,则另一个操作数应转换为long double.
  • 否则,如果任一操作数是double,则另一个操作数应转换为double.
  • 否则,如果任一操作数是float,则另一个操作数应转换为float.
  • 否则,应对两个操作数执行整体促销.