8

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

4

1 回答 1

8

[C++11: 5.19/3]:文字常量表达式是文字类型的纯右值核心常量表达式,但不是指针类型。整型常量表达式是整型或无范围枚举类型的字面常量表达式。[..]

和:

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

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

在这一点上,我找不到该代码不合规的原因,所以我怀疑是 GCC 错误。

但是,考虑到您在 4.10 中引用的段落被提议更改(活动问题 #903),这可能是一个故意的错误,因此这实际上是不合规的代码。


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

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

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

于 2012-11-21T12:33:57.737 回答