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

时间:2014-06-14 02:57:00

标签: c++ pointers c++11 language-lawyer

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

标准(C ++11§4.10/ 1)

  

空指针常量是整数类型的整数常量表达式(5.19)prvalue,其值为:   零或std::nullptr_t类型的prvalue。空指针常量可以转换为指针类型; ...

有四种可能性:

  1. 第4行正常,但第3行没有。这是因为xx+x都是常量表达式,其值为0,但只有x+x是prvalue。 gcc似乎采用了这种解释(live demo

  2. 第3行和第4行都可以。虽然x是左值,但是应用了左值到右值的转换,使得prvalue常量表达式等于0.我系统上的clang(clang-3.0)接受第3行和第4行。

  3. 第3行和第4行都不正常。两行中的clang-3.4错误(live demo)。

  4. 第3行正常,但第4行没有。 (包括为了完整性,即使我尝试的编译器没有表现出这种行为。)

  5. 谁是对的?它取决于我们正在考虑的标准版本吗?

1 个答案:

答案 0 :(得分:10)

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

  

空指针常量是整数文字(2.14.2),其值为零或prvalue类型为std::nullptr_t

问题903涉及一个奇怪的角落案例,其中不可能产生"正确的"在模板参数为(可能为0)整数常量的某些情况下的重载决策。

显然考虑了许多可能的解决方案,但

  

CWG中有一个强烈的共识,即只有文字0应被视为空指针常量,而不是当前指定的任何零值常量表达式。

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