我们可以在 C++ 中用一个限定为常量且值为 0 的变量来初始化一个指针吗?

Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?

根据C++ Primer这本书,我们可以将一个限定为const且值为0的变量赋值给一个指针。这是书中的相关行。

It is okay to assign the literal 0 or a const whose value is known to be 0 at compile time:

然后提供以下代码片段。

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;            
}

error: invalid conversion from 'int' to 'int*' [-fpermissive]

我做错了什么?

c_ivalint 类型。 piint* 类型。您不能将 int 隐式转换为 int* 因此您必须使用类型转换:

int *pi = (int*) c_ival; // C-style cast
// --or--
int *pi = reinterpret_cast<int*>(c_ival); // C++ style cast

这两种方法都有效,但都非常恶心。只需将 nullptr 分配给不指向任何东西并远离零的指针。

根据您的 C++ Primer 版本(以及它所针对的间接标准修订版),这可能只是信息过时的情况。

你看,C++03 和 C++11 之间的定义发生了变化。以前是这样写的:

[conv.ptr]

1 A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero.

但是一个突出的缺陷报告(CWG 903)被追溯应用到 C++11 并将措辞更改为

[conv.ptr]

1 A null pointer constant is an integer literal (5.13.2 [lex.icon]) with value zero or a prvalue of type std::nullptr_t.

因此,由于 C++11 c_ival 不再符合条件。它不是 文字 0,尽管它仍然是一个值为 0 的常量表达式。

Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?

我们曾经。自 C++11 以来,我们不再可以了。

What am I doing wrong?

您正在阅读这本书的旧版本。