3

控制浮点/双精度类型的 C++11 类型推断中的优先级的规则是什么,例如,当从包含多种类型的表达式进行推断时,如下所示:

auto var = float(1) * double(1);
4

3 回答 3

8

结果将是一个double. 这被称为floating point promotion

从标准来看,ISO 14882:2011 4.6 浮点提升

1 float 类型的纯右值可以转换为 double 类型的纯右值。值不变。
2 这种转换称为浮点提升。


正如@sftrabbit 所指出的,在5. Expressions中,新标准的第 9 段:

许多期望算术或枚举类型的操作数的二元运算符会以类似的方式导致转换和产生结果类型。目的是产生一个通用类型,这也是结果的类型。

这种模式称为通常的算术转换,其定义如下:

— 如果任一操作数是范围枚举类型(7.2),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
— 如果任一操作数是 long double 类型,则另一个应转换为 long double。
— 否则,如果任一操作数为双精度,则另一个应转换为双精度。
— 否则,如果任一操作数为浮点数,则另一个应转换为浮点数。
— 否则,应在两个操作数上执行积分提升 (4.5)。

于 2012-09-23T15:38:40.287 回答
2

类型推断不会添加任何新内容,“=”右侧的表达式一如既往地被评估,然后它的类型被用于“自动”。

当您查看 'auto var' 和 'auto & var' 之间的差异以及类似内容时,会稍微有趣一些,但这不是您的问题。

于 2012-09-23T15:38:53.927 回答
2

答案取决于所讨论的类型。在您的具体示例中,标准保证sizeof(double) >= sizeof(float)因此结果类型 ofdouble * float将始终为double. (这是从 C 语言继承的规则,在许多其他从 C 派生的语言中通常是相同的)

使用auto关键字初始化变量时,会确定初始化表达式的结果类型 - 无论是来自函数返回、计算还是 decltype 等。类型取决于您所使用的类型可用的隐式和显式转换重新使用。

于 2012-09-23T15:39:03.300 回答