【问题标题】:Can we initialize a pointer with a variable qualified as constant and having value 0 in C++?我们可以用一个限定为常量且在 C++ 中值为 0 的变量来初始化一个指针吗?
【发布时间】:2025-12-11 22:25:01
【问题描述】:

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

可以在编译时分配文字 0 或已知值为 0 的 const:

然后提供如下代码sn-p。

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++98 中编译,但不能在 C++11+ 中编译。在现代 C++ 中,更喜欢使用 nullptr

标签: c++ pointers nullptr null-pointer


【解决方案1】:

根据您的 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 不再符合条件。它不是 literal 0,尽管它仍然是一个值为 0 的常量表达式。

【讨论】:

  • 甚至值得一提的是,这会取消像 1-1 这样的表达式。
  • @cigien - 或者类似#define FALSE ('-'-'-') ;)
【解决方案2】:

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

我们曾经。从 C++11 开始我们不再可以。

我做错了什么?

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

【讨论】:

    【解决方案3】:

    c_ival 的类型为 intpi 的类型为 int*。您不能将int 隐式转换为int*,因此您必须使用类型转换:

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

    这两种方法都有效,但非常糟糕。只需将 nullptr 分配给不指向任何内容且远离零的指针。

    【讨论】:

      最近更新 更多