在C ++ 11类型推断期间,有哪些规则可以控制优先级?

时间:2012-09-23 15:35:55

标签: c++ c++11 type-inference

有关浮点数/双精度类型的C ++ 11类型推断中的优先级的规则是什么,例如,从包含多个类型的表达式推断时,如下所示:

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

3 个答案:

答案 0 :(得分:8)

结果将是double。这称为floating point promotion

从标准 ISO 14882:2011 4.6浮点促销

  

1 float类型的prvalue可以转换为double类型的prvalue。价值没有变化   2此转换称为浮点升级。


如@sftrabbit所述, 5。表达式,新标准第9段:

  

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

     

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

     

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

答案 1 :(得分:2)

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

当你看到'auto var'和'auto& amp;'之间的差异时,它会更有趣。 var'和类似的,但这不是你的问题。

答案 2 :(得分:2)

答案取决于所涉及的类型。在您的具体示例中,标准保证sizeof(double) >= sizeof(float)因此double * float的结果类型始终为double。 (这是继承自C语言的规则,并且在源自C的许多其他语言中通常是相同的)

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