【发布时间】:2020-02-23 23:23:18
【问题描述】:
我正在尝试了解 {} 初始化程序语法的全部功能。
我用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初始化警告的理解如下。在我的系统上: - short int 是 2 个字节 - int 是 4 个字节
因为初始化器的大小(以字节为单位)是 LHS 的两倍,这构成了缩小,因此会给出编译器警告。
但是对于 myChar 和 myChar2,这两个初始化器具有相同的数据类型:unsigned long long int。我相信 myChar2 的初始化已经发生,因为初始化器的值对于 char 数据类型来说太大了。
相同的规则似乎不适用于这两种情况: 1. 由于初始化器数据类型对于已初始化变量而言太大而失败 2. 初始化变量的值太大导致失败(虽然这里可以接受RHS数据类型)
我的理解是否正确 - 如果参数是整数文字,初始化列表的行为是否不同?
【问题讨论】:
-
如果你改用
constexpr int i = 0;会发生什么?它应该使静态确定初始化是否有问题变得更加简单。
标签: c++ initialization initializer-list