编译器如何选择给哪个值auto
How does the compiler choose which value to give auto?
首先,我知道这是一个极其简单的问题。我只是在寻找一个技术上的解释,为什么编译器决定使以下变量与一个自动类型说明符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
。
相关文章:
- 如何使用默认参数等选择模板专业化
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择要调用的构造函数
- C++选择排序算法中的逻辑错误
- QTreeView幻灯片多选后无法使用单击选择
- 无法获取菜单选择以运行函数.C++
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 在C++中,如何通过几种类型从元组中选择多个元素
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 对可变参数使用声明.如何选择正确的功能
- 如何在自定义类中启用'auto loops'?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 选择选举获胜者的程序
- 如何选择在 csv 文件中输出的位置
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 选择和修改嵌套向量中的条目的最佳实践
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 编译器如何选择给哪个值auto