这个constexpr整数不是空指针常量吗?

Lig*_*ica 8 c++ constexpr c++11

考虑以下C++ 11程序及其在GCC 4.7.2中的结果:

int main()
{
   constexpr int i = 0;
   int* p = i;
}

// g++ -g -ggdb -Wall -Wextra -pedantic -std=c++11 t.cpp
// t.cpp: In function 'int main()':
// t.cpp:4:13: error: invalid conversion from 'int' to 'int*' [-fpermissive]
// t.cpp:4:9: warning: unused variable 'p' [-Wunused-variable]
Run Code Online (Sandbox Code Playgroud)

根据标准:

[C++11: 4.10/1]:空指针常数是整数表达式(5.19)的整数类型的prvalue计算结果为零[..]

5.19是一个混乱,我没有完全解析它,但我们不期望i满足这个标准并充当空指针常量,因此不需要显式转换int*为初始化p

如果我s/constexpr/const/编译-ansi而不是编译,编译成功-std=c++11.

Lig*_*ica 8

[C++11: 5.19/3]:常量表达式是文本类型的prvalue核心常量表达式,但是没有指针类型.一个积分常量表达式是整体的或无作用域枚举类型的字面常量表达式.[..]

和:

[C++11: 3.9/10]: 类型是文字类型,如果它是:

  • 标量类型 ; 要么
  • 参考类型; 要么
  • 类类型(第9条),具有以下所有属性:[..]
  • 一个文字类型的数组.

此时,我找不到该代码不合规的原因,所以我怀疑是GCC错误.

然而,鉴于您提出的4.10中引用的段落被改变(活动问题#903),这可能是故意的错误,因此这实际上是不合规的代码.


如果我s/constexpr/const/编译-ansi而不是编译,编译成功-std=c++11.

整数常量表达式的定义在C++ 03中明确允许这种情况:

[C++03: 5.19/1]:[..]一个整数常量表达式只能涉及用常量表达式(8.5)初始化的整数或枚举类型的文字(2.13),枚举数,常量变量或静态数据成员,整数或枚举类型的非类型模板参数,以及sizeof表达式.[..]

  • 作为参考,[this](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#903)是相关的DR. (4认同)