我可以猜到这是一个新手问题,但我似乎错过了某个地方,加上我是新手,所以如果答案显而易见,那就不太吝啬......
我看到变量以多种方式声明:
DataType varName = value;
DataType varName(value);
DataType varName{value};
我认为这是作家选择情况之一,但最近我试图添加2个char变量并将其设置为另一个char变量,我使用了大括号版本:
unsigned char sum{ char1 + char2 };
我收到一个错误: 错误1错误C2398:元素'1':从'int'转换为'unsigned char&'需要缩小转换。
但我没有得到错误:
unsigned char sum(char1 + char2);
那么有人可以解释一下声明之间的区别,或者提供一个链接到一个网站吗?
...谢谢
答案 0 :(得分:1)
TL; DR:当你添加两个char
时,你得到一个int
,并且大括号初始化故意不允许这样的分配。
C ++,与C一致,执行整数提升以进行添加;因此,表达式char1 + char2
(假设char1
和char2
都属于char
类型)的类型不是人们所期望的char
,而是而是int
。标准的相关部分是§4.5(描述了积分促销),§4.13(积分转换)和§5.7(附加运算符,它们引起整体推广)。
至于为什么这导致语句unsigned char sum {char1 + char2};
失败,大括号初始化专门用于帮助阻止程序员执行缩小转换(第8.5.3节),这可能导致溢出。因为int
的大小至少是char
的两倍(在八位字节可寻址的机器上*),这是一个缩小的转换,因此失败。
当然,最后,你可能想停下来问问自己,“无论如何,添加两个角色究竟是什么意思?”
*对于感兴趣的人来说,C ++表示int
足够大,至少可以保存INT_MIN
到INT_MAX
(§3.9.2)的值,并将这些宏的定义委托给C(§18.3.3.2),它们(附件E,§1)的最小值分别为-32767和+32767 **。因此,int
需要至少16位。另一方面,char
至少为8位宽。 C还将char
定义为一个字节宽(§6.2.5.3,§5.2.1),其中一个字节(§3.6)是一个“可寻址的数据存储单元,其大小足以容纳基本字符的任何成员执行环境的集合。“严格地说,我认为char
可以通过这个定义大于而不是一个字节,但我很确定它不能比任何其他类型更宽。
**那是-32767,而不是-32768。实际上,C实际上并没有对实现的有符号整数强加二进制补码表示。
答案 1 :(得分:0)
如果value
不是DataType
并且ctor被写为explicit
,则无法使用您的第一个示例。第二个将尝试使用参数value
调用ctor,但如果它是explicit
则会有效。第三个是括号,可以防止缩小转换次数。