我们可以使用C++中限定为常量且值为0的变量来初始化指针吗?
根据 C++ Primer 一书,我们可以将限定为 const 且值为 0 的变量分配给指针。这是书中的相关内容。
可以分配文字 0 或在编译时已知其值为 0 的常量:
然后提供以下代码片段。
int ival;
int zero = 0;
const int c_ival = 0;
int *pi = ival; // error
pi = zero; // error
pi = c_ival // ok: c_ival is a const with compile-time value of 0
但是,当我运行类似的代码时,会引发错误。
int main()
{
const int c_ival = 0;
int *pi = c_ival;
}
错误:从“int”到“int*”的无效转换 [-fpermissive]
我究竟做错了什么?
回答
根据您的 C++ Primer 版本(以及它所针对的间接标准修订版),这可能只是过时信息的一种情况。
你看,C++03 和 C++11 之间的定义发生了变化。过去,它说:
[转化率]
1 空指针常量是整数类型的整数常量表达式 (5.19) 右值,其计算结果为零。
但是一个未完成的缺陷报告 ( CWG 903 ) 被追溯应用到 C++11 并将措辞更改为
[转化率]
1 空指针常量是具有零值的整数文字 (5.13.2 [lex.icon]) 或类型为 std::nullptr_t 的纯右值。
因此,由于 C++11c_ival不再符合条件。它不是文字0,尽管它仍然是一个值为 0 的常量表达式。