c – 空指针常量初始化:哪种行为正确?

int main() {
    const int x = 0;
    int* y = x;   // line 3
    int* z = x+x; // line 4
}

标准(C11§4.10/ 1)

A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to
zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; …

有四种可能性:

>第4行正常,但第3行没有.这是因为x和x x都是常量表达式,其值为0,但只有x x是prvalue.似乎gcc采用了这种解释(live demo)
>第3行和第4行都可以.虽然x是左值,但是应用了左值到右值的转换,使得prvalue常量表达式等于0.我的系统上的clang(clang-3.0)接受第3行和第4行.
>第3行和第4行都不正常.两条线上的clang-3.4错误(live demo).
>第3行没问题,但第4行没有. (包括为了完整性,即使我尝试的编译器没有表现出这种行为.)

谁是对的?是否取决于我们正在考虑的标准版本?

解决方法

标准中的措辞因 DR 903而改变.新的措辞是

A null pointer constant is an integer literal (2.14.2) with value zero or a prvalue of type std::nullptr_t.

问题903涉及一个奇怪的角落情况,在模板参数是(可能是0)整数常量的某些情况下,不可能产生“正确的”重载分辨率.

显然考虑了一些可能的决议,但是

There was a strong consensus among the CWG that only the literal 0 should be considered a null pointer constant,not any arbitrary zero-valued constant expression as is currently specified.

所以,是的,这取决于编译器是否已经实现了DR 903的分辨率.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...