C++ 为什么编译器赢了';t自动假定看似浮点常量的值为浮点

C++ 为什么编译器赢了';t自动假定看似浮点常量的值为浮点,c++,overloading,C++,Overloading,让我们看看下面的函数重载声明 void funA(int); void funA(float); 然后我们调用如下函数: funA(1); // this will be ok. 但是, funA(1.333) // this will not ok.. 对于编译器来说,funA(int)和funA(float)是不明确的。。 编译器将1.333值转换为整数(1)。。虽然假设它是一个浮点值更合适 我使用的是g++(GCC)4.8.2 为什么编译器不调用fu

让我们看看下面的函数重载声明

void funA(int);
void funA(float);
然后我们调用如下函数:

funA(1);          // this will be ok.
但是,

funA(1.333)         // this will not ok..
对于编译器来说,funA(int)和funA(float)是不明确的。。 编译器将1.333值转换为整数(1)。。虽然假设它是一个浮点值更合适

我使用的是g++(GCC)4.8.2 为什么编译器不调用funA(float)? 然而,以下方法是有效的

funA(static_cast<float>(1.333))
funA(静态演员阵容(1.333))

文本
1.333
是一个
双精度
,而不是
浮点
。从
double
int
的转换被认为与从
double
float
的转换一样好,因此导致不明确的重载错误。要消除歧义,请传递一个浮点:

funA(1.333f);
如果您希望确保将带有
参数的调用分派到
funA(float)
,那么您可以按照@JamesKanze的注释示例进行操作:

void funA( double v ) 
{ 
  return funA( static_cast<float>( v ) );
}
void funA(双v)
{ 
返回funA(静态_铸造(v));
}

但请注意,
double
的范围可能大于
float
文本
1.333
double
,而不是
float
。从
double
int
的转换被认为与从
double
float
的转换一样好,因此导致不明确的重载错误。要消除歧义,请传递一个浮点:

funA(1.333f);
如果您希望确保将带有
参数的调用分派到
funA(float)
,那么您可以按照@JamesKanze的注释示例进行操作:

void funA( double v ) 
{ 
  return funA( static_cast<float>( v ) );
}
void funA(双v)
{ 
返回funA(静态_铸造(v));
}


但是请注意,
double
的范围很可能大于
float

1.333
的范围不是
float
-literal,尽管它是一个浮点文本,但具体来说是
double
类型。因为
1.333
是double类型(与所有浮点文本一样)
1.333f
就可以了。@code:
1.333f
是真正的浮点文字,但不是
double
@Deduplicator类型,他没有说是。再次阅读他的评论。@user3477950他说所有的浮点文本都是double类型;然而
1.333f
反驳了这一说法
1.333
不是一个
float
-文本,尽管它是一个浮点文本,但具体来说是
double
类型。因为
1.333
是double类型(与所有浮点文本一样)
1.333f
就可以了。@code:
1.333f
是真正的浮点文字,但不是
double
@Deduplicator类型,他没有说是。再次阅读他的评论。@user3477950他说所有的浮点文本都是double类型;然而,
1.333f
反驳了这一说法,他违反了关于重载的一般规则:如果你重载任何整数类型(除了可能的
char
),那么也重载
int
;如果您重载任何浮点类型,则也重载
double
。因为OP刚刚发现的原因。(你可以建议他在重载函数集中添加
funA(double v){funA(static_cast(v));}
。)嗨,谢谢你的回答。。好的,像1.3333这样的文字会自动假定为double而不是float。。但是,为什么编译器选择使用带double的重载函数,即使没有定义带double的重载函数?您提到从double到int的转换被认为与double到float的转换一样好。。这是为什么?@Ari编译器不会将任何内容转换为double。像
1.23
这样的文字在语言中被定义为
double
,就像
42
int
一样。至于到其他数字类型的转换,这些是语言的规则。我只能推测,这是因为这是一个更简单的规则来执行和记住。谢谢。我试着总结一下编译器总是将像3.22这样的文本定义为double如果将此文本馈送到函数,如果找不到接受double的函数,编译器将使用可能接受int、float或(?)的可用版本,并将文本强制转换为int或float-如果两个版本都存在,编译器将不喜欢浮点版本而不是int版本,尽管它看起来可能更合适(?)-强制转换将更改文字表示形式,无论是从double强制转换为int还是从double强制转换为float,因此它们对编译器都同样有用。@Ari是的,听起来不错!他违反了关于重载的一般规则:如果你重载任何整数类型(除了可能
char
),那么也重载
int
;如果您重载任何浮点类型,则也重载
double
。因为OP刚刚发现的原因。(你可以建议他在重载函数集中添加
funA(double v){funA(static_cast(v));}
。)嗨,谢谢你的回答。。好的,像1.3333这样的文字会自动假定为double而不是float。。但是,为什么编译器选择使用带double的重载函数,即使没有定义带double的重载函数?您提到从double到int的转换被认为与double到float的转换一样好。。这是为什么?@Ari编译器不会将任何内容转换为double。像
1.23
这样的文字在语言中被定义为
double
,就像
42
int
一样。至于到其他数字类型的转换,这些是语言的规则。我只能推测,这是因为这是一个更简单的规则来执行和记住。谢谢。我试着总结一下编译器总是将像3.22这样的文本定义为double如果这