sha*_*oth 86 c++ pointers initialization built-in-types visual-c++
以下代码(取自此处):
int* ptr = int();
Run Code Online (Sandbox Code Playgroud)
在Visual C++中编译并对指针进行值初始化.
怎么可能?我的意思是int()
产生一个类型的对象,int
我不能指定int
一个指针.
上面的代码如何不违法?
Jer*_*fin 110
int()
是一个值为0的常量表达式,因此它是产生空指针常量的有效方法.最终,这只是一种略微不同的说法int *ptr = NULL;
Bla*_*iev 35
因为int()
产量0
,可以互换NULL
.NULL
本身被定义为0
,与C的NULL
这是(void *) 0
.
请注意,这将是一个错误:
int* ptr = int(5);
Run Code Online (Sandbox Code Playgroud)
这仍然有效:
int* ptr = int(0);
Run Code Online (Sandbox Code Playgroud)
0
是一个特殊的常量值,因此可以将其视为指针值.产生的常量表达式0
,例如1 - 1
允许作为空指针常量.
Mar*_*som 18
表达式int()
求值为一个常量的默认初始化整数,即值0.该值是特殊的:它用于初始化指向NULL状态的指针.
Luc*_*ton 13
从n3290(C++ 03使用类似文本),4.10指针转换[conv.ptr]第1段(重点是我的):
1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或类型为std :: nullptr_t的prvalue.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为空指针转换.[...]
int()
是一个整数类型的整数常量表达式prvalue,它的计算结果为零(这是一个满口!),因此可用于初始化指针类型.正如您所看到的,0
并不是唯一一个特殊表达的积分表达式.