首先,我知道这是一个非常简单的问题。我只是在寻找一个技术解释,说明为什么编译器决定用自动类型说明符生成以下变量,类型为double over int:
int value1 = 5;
double value2 = 2.2;
auto value3 = value1 * value2;
我知道编译器会从初始值派生value3的double类型,但为什么会这样呢?
答案 0 :(得分:5)
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
。- 否则,应对两个操作数执行整体促销。
答案 1 :(得分:2)
因为将int
乘以double
后,您会获得double
。
答案 2 :(得分:1)
C和C ++编译器总是将基本数字类型提升为表达式中包含的最常规类型。因此,任何涉及两个int
值的表达式都会生成int
,但如果其中一个操作数为double
,那么表达式值也将为double
。