【问题标题】:Pointer to reference to const null value指向 const null 值的指针
【发布时间】:2016-11-27 12:42:17
【问题描述】:

这是代码:

const int   x = 0;
const int&  r = x;

const int*  p1 = x;  // Works (p1 = 0)
const int*  p2 = r;  // error C2440: 'initializing': cannot convert from 'const int' to 'const int *'

为什么 p1 设置为 x 的值,而 p2 不设置?

是不是因为 p2 不能仅仅通过查看 r 来保证 x 是 const 的?
或者是否还有其他关于导致此错误的引用的微妙之处?

【问题讨论】:

  • cosnt int* p1 = x; 甚至不应该编译。你用的是哪个编译器?
  • 您第一次使用p1 也是不合法的。你的两个指针初始化都是错误的。
  • VS 2015,打开 /W4、/sdl 和 /WX。如果 x 是非 const 则不编译,但使用 const 编译。
  • 再次阅读错误信息。尤其是它告诉你的类型。类型一样吗?
  • @Rakete1111:看起来像 Visual C++。但接下来的问题是:1)哪个版本? 2)哪些编译器标志?您可以通过指定错误的标志来削弱每个 C++ 编译器,而默认标志通常总是错误的。

标签: c++ pointers reference constants


【解决方案1】:

第三行应该会引发错误。它不在 VS2015 中,因为编译器或标准中存在错误,具体取决于应用的标准。其他编译器确实会发出有关此行的错误消息。

在 C++11 之前,任何计算结果为 0 的整型常量表达式都被视为 空指针常量,因此第一行等价于 const int* p1 = NULL;,它不使 p1 指向 x

自 C++14 起,情况不再如此。粗略地说,只有字面量零和nullptr 是有效的空指针常量。

在两者之间,即在 C++11 中,标准实际上允许将求值为 0 的常量表达式视为空指针常量。这被视为标准中的缺陷。它已在 C++14 中修复。一些编译器(gcc、clang)选择立即修复缺陷,即使在 C++11 模式下也会报告错误。 VS2015 没有。

第四行在任何版本的 C++ 中都无效,因为 r 的类型是引用,而不是整数。

【讨论】:

  • 我在互联网上没有找到任何关于此错误的参考。您是否碰巧知道它是否存在未解决的问题,或者来自 MS 的任何官方信息(也许“不会修复”)?
  • C++11 声明“空指针常量是整数类型的整数常量表达式 (5.19) 纯右值,其计算结果为零或 std::nullptr_t 类型的纯右值。”。显然它被认为是标准中的缺陷,并已在 14 中进行了更改。相关答案:stackoverflow.com/a/40787595/2456565
【解决方案2】:

指针代表一个值的地址,所以要初始化你的指针,你应该使用“address-of”操作符:&

const int *p1 = &x;
const int *p2 = &r;

您可以设置指向0 的指针(这在PC 上不是有效地址),因为这与将其设置为NULL 相同。

【讨论】:

  • 我知道,我故意将指针地址设置为空。这仅用于学术目的。
  • "您可以将指针设置为 0(这不是 PC 上的有效地址),因为这与将其设置为 NULL" i> C++ 没有NULL,真的;不鼓励使用它。该标准明确提到文字 0 可用于将任何指针初始化为实现定义的空指针值。并且 c++11(仅)允许任何计算结果为 0constexpr 也用于此目的。
  • “您可以将指针设置为 0(这在 PC 上不是有效地址),因为这与将其设置为 NULL 相同。” 不是他在代码中的做法,不。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多