Ren*_*Ren -1 c++ arrays int initialization list-initialization
#include<iostream>
int main()
{
int arr[1] = {0x80000000};
std::cout<<arr[0]<<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将收到以下错误:
错误:缩小'2147483648u'从'unsigned int'到'int'的转换{} [-Wnarrowing] int arr [1] = {0x80000000};
但以下代码完美运行:
#include<iostream>
int main()
{
int arr[1];
arr[0] = 0x80000000;
std::cout<<arr[0]<<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:为什么我不能使用'0x80000000'初始化一个数组int?
0x80000000不适合int这里,所以它是一个带有类型的整数文字unsigned int.对于初始化,需要隐式转换,但除了赋值之外,隐式转换是有限的,即在列表初始化中禁止缩小转换(从C++ 11开始):
list-initialization通过禁止以下内容来限制允许的隐式转换:
- ...
- 从整数或无范围枚举类型转换为不能表示原始值的整数类型,除非source是一个常量表达式,其值可以精确地存储在目标类型中
关于隐式转换的行为,即赋值中的积分转换:
如果目标类型已签名,则如果源整数可以在目标类型中表示,则值不会更改.否则结果是实现定义的.
超出范围转换的行为是实现定义的,例如它可以根据表示的规则(通常为2的补码)进行环绕.
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |