"int* ptr = int()"值初始化如何不违法?

How is "int* ptr = int()" value initialization not illegal?

本文关键字:int 何不违 初始化 ptr      更新时间:2023-10-16

以下代码(摘自此处):

int* ptr = int();

在Visual c++中编译,并对指针进行值初始化。

这怎么可能?我的意思是int()产生一个类型为int的对象,而我不能将int赋值给一个指针。

为什么上面的代码不是非法的?

int()是一个值为0的常量表达式,因此它是产生空指针常量的有效方法。最终,它只是表示int *ptr = NULL;

的一种稍微不同的方式

因为int()产生0,这与NULL是可互换的。NULL本身定义为0,而C语言的NULL定义为(void *) 0

注意这将是一个错误:

int* ptr = int(5);

,这仍然会工作:

int* ptr = int(0);

0是一个特殊的常量值,因此它可以被视为指针值。生成0的常量表达式,如1 - 1,也可以作为空指针常量。

表达式int()的计算结果为默认初始化的常量整数,值为0。该值是特殊的:它用于初始化指向NULL状态的指针。

从n3290 (c++ 03使用类似的文本),4.10指针转换[convr .ptr]第1段(重点是我的):

1空指针常量是一个整型常量表达式(5.19),值为0的整型右值或std::nullptr_t类型的右值。空指针常量可以转换为指针类型;的结果是该类型的空指针值,与其他对象指针或函数指针类型的值不同。这样的转换称为空指针转换。[…]

int()就是这样一个整型常量表达式,其值为0(这太长了!),因此可以用来初始化指针类型。如您所见,0不是唯一的特殊大小写整型表达式。

int不是对象。

我相信这里发生的事情是你告诉int*指向某个由int()

决定的内存地址

所以如果int()创建0,int*将指向内存地址0