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

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;

  • +1,*常量表达式*位是重要的,并且在前2个upvoted答案中缺失. (3认同)
  • @Nils因为很明显`0`可能意味着空指针常量或数字0,而`nullptr`显然是空指针常量.此外,正如Jamin所说,它还有"额外的编译时检查".在打字之前,请尝试思考. (3认同)
  • @Nils:代码清晰度并通过代码声明您的意图.当然,使用C++ 11,现在你想使用nullptr,因为它还将额外的编译时检查的好处投入到混合中. (2认同)

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允许作为空指针常量.

  • "`0`是一个特殊的文字" - 只是因为它是一个常量表达式,并且它具有特殊值0.`(1-1)`同样特殊,它也是一个空指针常量,因此是`int() `."0"是一个文字的事实是足够的,但不是必须条件成为一个常量表达式.像`strlen("")`这样的东西,虽然它也有特殊值`0`,但它不是一个常量表达式,因此不是空指针常量. (5认同)

Mar*_*som 18

表达式int()求值为一个常量的默认初始化整数,即值0.该值是特殊的:它用于初始化指向NULL状态的指针.

  • 这在Jerry的答案中缺少一个非常重要的细节:表达式产生值0是不够的,但它也必须是*constant-expression*.对于反例,使用`int f(){return 0; ``,表达式`f()`产生值0,但它不能用于初始化指针. (2认同)

Luc*_*ton 13

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

1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其计算结果为零或类型为std :: nullptr_t的prvalue.空指针常量可以转换为指针类型; 结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开.这种转换称为空指针转换.[...]

int()是一个整数类型的整数常量表达式prvalue,它的计算结果为零(这是一个满口!),因此可用于初始化指针类型.正如您所看到的,0并不是唯一一个特殊表达的积分表达式.