【发布时间】:2012-09-15 05:46:42
【问题描述】:
在 C++11 类型推断中控制浮点/双精度类型优先级的规则是什么,例如,当从包含多种类型的表达式进行推断时,如下所示:
auto var = float(1) * double(1);
【问题讨论】:
-
当然包含多种类型,但它是只有一种类型:
double。
标签: c++ c++11 type-inference
在 C++11 类型推断中控制浮点/双精度类型优先级的规则是什么,例如,当从包含多种类型的表达式进行推断时,如下所示:
auto var = float(1) * double(1);
【问题讨论】:
double。
标签: c++ c++11 type-inference
结果将是double。这称为floating point promotion。
从标准,ISO 14882:2011,4.6 浮点提升:
1 float 类型的纯右值可以转换为 double 类型的纯右值。值不变。
2 这种转换称为浮点提升。
如@sftrabbit 所述,在5 中。表达式,新标准第 9 段:
许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,也就是结果的类型。
这种模式称为普通算术转换,定义如下:
——如果任一操作数是作用域枚举类型 (7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
— 如果任一操作数为 long double 类型,则另一个应转换为 long double。
— 否则,如果任一操作数为双精度,则另一个应转换为双精度。
— 否则,如果任一操作数为浮点数,则另一个应转换为浮点数。
— 否则,应在两个操作数上执行积分提升 (4.5)。
【讨论】:
答案取决于所讨论的类型。在您的具体示例中,标准保证sizeof(double) >= sizeof(float) 因此double * float 的结果类型将始终为double。 (这是从 C 语言继承的规则,在许多其他从 C 派生的语言中通常是相同的)
当使用 auto 关键字初始化变量时,初始化表达式的结果类型将被确定 - 无论是来自函数返回、计算、decltype 等。类型取决于可用的隐式和显式转换对于您正在使用的类型。
【讨论】:
类型推断不会添加任何新内容,“=”右侧的表达式一如既往地被评估,然后将其类型用于“自动”。
当您查看 'auto var' 和 'auto & var' 和类似内容之间的差异时会稍微有趣一些,但这不是您的问题。
【讨论】: