考虑以下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
进行编译,则编译会成功。
答案 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
表达式。 [..]