问题描述
根据《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 之间的定义发生了变化。过去,它说:
[conv.ptr]
1 空指针常量是整数常量表达式 (5.19) 计算结果为零的整数类型的右值。
但是一个未完成的缺陷报告 (CWG 903) 被追溯应用到 C++11 并将措辞更改为
[conv.ptr]
1 空指针常量是一个整数文字 (5.13.2 [lex.icon]) 值为零或类型为 std::nullptr_t 的纯右值。
因此,由于 C++11 c_ival
不再符合条件。尽管它仍然是一个值为 0 的常量表达式,但它不是 文字 0。
c_ival
的类型为 int
。 pi
是 int*
类型。您不能将 int
隐式转换为 int*
,因此您必须使用类型转换:
int *pi = (int*) c_ival; // C-style cast
// --or--
int *pi = reinterpret_cast<int*>(c_ival); // C++ style cast
这两种方法都有效,但非常粗糙。只需将 nullptr
分配给不指向任何内容且远离零的指针。
我们可以使用 C++ 中限定为常量且值为 0 的变量来初始化指针吗?
我们曾经。从 C++11 开始,我们不再可以了。
我做错了什么?
您正在阅读该书的过时版本。