我们可以使用 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 之间的定义发生了变化。过去,它说:

[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 的类型为 intpiint* 类型。您不能将 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 开始,我们不再可以了。

我做错了什么?

您正在阅读该书的过时版本。