【问题标题】:How does the compiler choose which value to give auto?编译器如何选择自动赋予哪个值?
【发布时间】:2014-10-17 08:28:05
【问题描述】:

首先,我知道这是一个非常简单的问题。我只是在寻找关于为什么编译器决定使用自动类型说明符将以下变量设置为 int 类型的技术解释:

int value1 = 5;
double value2 = 2.2;
auto value3 = value1 * value2;

我知道编译器会从初始化的值中为 value3 派生出 double 类型,但为什么会这样呢?

【问题讨论】:

  • int * doubledouble。我不了解你,但我不希望 std::cout << (3 * 1.5); 打印 4。
  • “但究竟为什么呢?” - 因为 C++ 规范是这么说的。之所以这么说,是因为它可能是定义行为的最有意义的方式。
  • 如果你想要章节和诗句,请查找 c++ 扩展转换,例如 stackoverflow.com/questions/3841839/…

标签: c++ int double auto


【解决方案1】:

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
  • 否则,应对两个操作数执行积分提升。

【讨论】:

    【解决方案2】:

    因为将intdouble 相乘时会得到double

    【讨论】:

      【解决方案3】:

      C 和 C++ 编译器总是将基本数值类型提升为表达式中包含的最通用类型。因此,任何涉及两个int 值的表达式都会产生一个int,但如果其中一个操作数是double,那么表达式值也将是double

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多