在C++初始化程序列表中使用Integer Literals



我正在努力理解{}初始化程序语法的全部功能。

我用g++编译了以下代码:

int i = 0;                /* OK */
short int si2 {i};        /* Warning: Narrowing Conversion inside {...} */
char myChar {127ULL};     /* OK */
char myChar2 {128ULL};    /* Warning: Narrowing Conversion inside {...} */

我对si2初始化警告的理解如下。在我的系统上:-短int为2字节-int是4字节

因为初始值设定项的大小(以字节为单位(是LHS的两倍,所以这构成了缩小,因此会发出编译器警告。

但是,对于myCharmyChar2,两个初始化项都具有相同的数据类型:unsigned long-long-int。我认为初始化myChar2是因为初始化器的值对于char数据类型来说太大。

相同的规则似乎不适用于这两种情况:1.失败,因为初始值设定项数据类型对于初始化的变量来说太大2.失败,因为值对于初始化的变量来说太大(尽管这里可以接受RHS数据类型(

我在这里的理解正确吗?如果参数是整数,初始化器列表的行为是否不同?

默认情况下,编译器认为类型char与类型signed char类似。

在这些声明中,

char myChar {127ULL};     /* OK */
char myChar2 {128ULL};

初始化器具有正值并且不能在带符号char类型的对象中表示正值CCD_ 3。

可由带符号字符类型表示的最大正值为127。也就是说,这些值的范围是[-128, 127]

因此编译器会发出警告。

对于本声明,

short int si2 {i}; 

编译器发出警告,因为初始值设定项不是编译时常数。

如果你要写

const int i = 0;

则警告消失。

记住这件事。

当与内置类型的变量一起使用时,这种形式的初始化有一个重要属性:如果初始化器可能导致信息丢失,编译器将不允许我们列出内置类型的初始化变量:

long double ld = 5.14159265;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld; // ok: but value will be truncated

编译器拒绝a和b的初始化,因为对初始化int可能会丢失数据。ld的分数部分至少为截断。此外,ld中的整数部分可能太大,无法放入int。

现在是最后两部分。您定义了char,它是有符号类型的。它可以保存-128到127之间的值。但您正试图分配128,这就是编译器发出的警告。

最新更新