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

时间:2012-11-21 12:31:33

标签: c++ c++11 constexpr

考虑以下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]

根据标准:

  

[C++11: 4.10/1]: 空指针常量是整数类型的整数常量表达式(5.19)prvalue,其求值为零[...]

5.19是一团糟,我无法完全解析它,但我们不希望i满足此标准并充当空指针常量,因此不需要显式转换为int*以初始化p

如果我s/constexpr/const/并使用-ansi而不是-std=c++11进行编译,则编译会成功。

1 个答案:

答案 0 :(得分:8)

  

[C++11: 5.19/3]: 文字常量表达式是文字类型的prvalue核心常量表达式,但不是指针类型。 整数常量表达式是整数或未整数枚举类型的文字常量表达式。 [..]

  

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

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

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

然而,鉴于您引用4.10的段落被提议更改(active issue #903),这可能是一个故意的错误,因此这实际上是不合规的代码。


  

如果我s/constexpr/const/并使用-ansi而不是-std=c++11进行编译,则编译会成功。

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

  

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