Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译器如何选择给auto的值?_C++_Int_Double_Auto - Fatal编程技术网

C++ 编译器如何选择给auto的值?

C++ 编译器如何选择给auto的值?,c++,int,double,auto,C++,Int,Double,Auto,首先,我知道这是一个非常简单的问题。我只是想从技术上解释为什么编译器决定使用自动类型说明符将以下变量设置为double over int类型: int value1 = 5; double value2 = 2.2; auto value3 = value1 * value2; 我知道编译器会从初始化的值中派生出value3的double类型,但具体原因是什么?因为当int乘以double时,您会得到一个doubleauto变量类型是根据模板类型推断定义的。像这样: template<t

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

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

我知道编译器会从初始化的值中派生出value3的double类型,但具体原因是什么?

因为当
int
乘以
double
时,您会得到一个
double
auto
变量类型是根据模板类型推断定义的。像这样:

template<typename T>
void f(T t);

f(value1 * value2);  // will call f<double>()
模板
空隙f(T);
f(值1*2);//将调用f()
之所以
value1*value2
给出
double
而不是
int
,是因为算术转换规则允许将
int
转换为
double
(反之也是隐式转换,但不是算术转换)。在内置类型上使用运算符时,“将应用通常的算术转换”

以下是本标准第5节(表达式)中的规则:

许多期望操作数为算术或枚举类型的二进制运算符会导致转换,并以类似的方式生成结果类型。其目的是生成一个公共类型,该类型也是结果的类型。此模式称为常用算术转换,其定义如下:

  • 如果任一操作数为作用域枚举类型,则不执行任何转换;如果另一个操作数的类型不同,则表达式的格式不正确
  • 如果任一操作数的类型为
    长双精度
    ,则另一个操作数应转换为
    长双精度
  • 否则,如果其中一个操作数是
    double
    ,则另一个操作数应转换为
    double
  • 否则,如果任一操作数为
    浮点
    ,则另一个操作数应转换为
    浮点
  • 否则,应在两个操作数上执行积分提升

C和C++编译器总是将基本数字类型推广到表达式中包含的最一般类型。因此,任何包含两个

int
值的表达式都会生成一个
int
,但是如果其中一个操作数是
double
,那么表达式值也将是
double

int*double
double
。我不知道你,但我不希望代码> STD::CUT“但是为什么是那个?”——因为C++规范这么说。它之所以这么说是因为它可能是定义行为的最有意义的方式。如果你想要章和诗,请查阅C++加宽转换。