考虑以下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]: 空指针常量是一个整数类型的整数常量表达式(prvalue),其评估结果为零。
5.19很混乱,我没能完全解析它,但我们不希望i满足这个条件并且作为空指针常量,因此在初始化p时不需要显式转换为int*吗?
如果我用constexpr替换const并使用-ansi而不是-std=c++11进行编译,则编译将成功。
i
是一个左值。但由于表达式在某种程度上涉及左值到右值的转换,之后,标准使其成为常量表达式,我们可以合理地认为它是一个NPC,尽管可能是反常的。请注意,在重载解析中它会造成混乱,特别是当您在模板中使用未知值时。顺便说一句,我不会将gcc视为基准,在这里,他们对常量的处理方式很可怕。 - jpaleceknullptr
将无处不在,并且您将永远无法将整数类型(常量或其他)分配给指针而不使用转换。为了保持向后兼容性,我认为仅将其限制为文字0
是有意义的,没有必要将更复杂的常量表达式用作空指针常量,即使它恰好评估为零。 - Andrew Tomazos