Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ 为什么编译器与“匹配”;char";至;int";但不是",;简短的“;?_C++_Type Conversion_Overloading_Language Lawyer - Fatal编程技术网

C++ 为什么编译器与“匹配”;char";至;int";但不是",;简短的“;?

C++ 为什么编译器与“匹配”;char";至;int";但不是",;简短的“;?,c++,type-conversion,overloading,language-lawyer,C++,Type Conversion,Overloading,Language Lawyer,我有一个小程序: #include<iostream> using namespace std; void f(int) { cout << "int\n"; } void f(short) { cout << "short\n"; } int main(void){ char c = 0; f(c); return 0; } #包括 使用名称空间std; void f(int){coutFrom(参考文献): 以下隐式转

我有一个小程序:

#include<iostream>
using namespace std;

void f(int)   { cout << "int\n";   }
void f(short) { cout << "short\n"; }

int main(void){
    char c = 0;
    f(c);
    return 0;
}
#包括
使用名称空间std;
void f(int){coutFrom(参考文献):

以下隐式转换被归类为整体升级:

  • [……]
  • char
    可以转换为
    int
    unsigned int
    ,具体取决于基础类型:
    signed char
    unsigned char
    (见上文)
  • [……]
因此,如果有一个函数
f(int)
f(short)
,编译器将首先尝试执行整数提升,如果不可能,它将退回到整数转换

char
int
是一个整数提升(见上文),因此编译器将选择它

如果没有任何
f(int)
,编译器将无法找到可以进行整数提升的函数,并将退回到整数转换。它会找到
f(short)
,并且
char
可以转换为
short
,因此它将选择它。

(整数)提升优先于其他(整数)转换

隐式转换序列的排序

1) 精确匹配:无需转换,左值到右值转换,限定转换,函数指针转换,(自C++17)类类型到同一类的用户定义转换

2)提升:整体提升、浮点提升

3)转换:积分转换、浮点转换、浮点积分转换、指针转换、指针到成员转换、布尔转换、派生类到其基的用户定义转换

因此,从
char
int
的升级比从
char
short
的转换更可取


什么是促销?你可能会问。这是标准中描述的一种特殊的转换

为什么
char
to
short
不是促销?您可以继续。始终是to
int
或更大的类型。对于
short
没有促销活动

以下隐式转换被归类为整体升级:

  • 有符号字符或有符号短字符可以转换为int

  • 如果无符号字符或无符号短字符可以保存其整个值范围,则可以将其转换为int,否则可以将无符号int转换为int

  • 字符可以转换为int或unsigned int取决于基础类型:有符号字符或unsigned字符(见上文)

  • wchar__t、char16_t和char32_t可以转换为以下列表中的第一种类型,能够保存其整个值范围:int、unsigned int、long、unsigned long、long long、unsigned long long; 基础类型不固定的非范围枚举类型可以转换为以下列表中的第一个类型,该类型能够保存其整个值范围:int、unsigned int、long、unsigned long、long long或unsigned long long。如果值范围更大,则不应用整数提升

  • 基础类型为固定的非作用域枚举类型可以转换为其提升的基础类型

    (从C++11开始)

  • 若位字段类型可以表示位字段的整个值范围,则可将其转换为int;若位字段类型可以表示位字段的整个值范围,则可将其转换为无符号int,否则不适用整数升级; 类型bool可以转换为int,值为false​0​ 真的变成了1


标准参考文件(现行标准草案):


你想解决的是什么问题,还是这纯粹是好奇?不进行短期升级的(有点可疑)理由是
int
被认为是最佳处理器/寄存器大小,
short
只是一个压缩内存布局。因此,int(“寄存器”)用于处理
字符
。假定短减法不会比整数减法更有效。@JoopEggen-这不是原理(可疑或其他)这是一个设计决定:在C++和C++中, int >代码>应该是结构的自然尺寸,所以当没有一个好的理由去选择其他的东西时,它应该被使用。@ PeteBecker我想为设计决定做个原因。非常好的问题+1!!!他们为什么用“转换”这个词在列表本身中,当确定整数提升和转换之间的差异时?这似乎是一个潜在的歧义/混淆源,尤其是在引用时。@JAB好问题:)我认为他们的意思是提升是一种特殊类型的转换。但因为它仍然是一种转换,他们部分地这样称呼它,他们确实是这样做的请注意,在报价开始时,整数促销属于隐式转换类别,这是有道理的。为什么文字0被视为字符而不是整数类型?@shasan literal 0不被视为字符。它(通常)“被感知”作为int。此外,char是一种整数类型。请在原始问答的上下文中再次查看我的问题。该问题询问为什么使用
0
的函数调用调用int重载。答案解释了“从char到int的提升优于从char到short的转换”.
这个问题问为什么用0调用函数会调用int重载。
不是。它问为什么用
c
调用重载函数会选择
int
重载,而不是
short
c
不是文本0;它是
char
左值。原因是一次转换(升级)是首选的