【问题标题】:What are the different nullptr types?有哪些不同的 nullptr 类型?
【发布时间】:2016-06-20 03:10:02
【问题描述】:

我正在阅读这个问题:

In c++11, does dynamic_cast return nullptr or 0?

我了解到 dynamic_cast 的结果可以是特定类型的空值:

考虑一个变量 char * ptr。它的类型(不出所料)是 char *。 但是 nullptr 的类型是特殊类型 nullptr_t。所以当我们 写ptr = nullptr之类的东西,一定会发生一些技术性的事情

nullptr 必须隐式转换为 char *。这个结果 转换设置为 ptr 的新值。 char * 的空值 是将 nullptr 转换为 char * 的结果。从概念上讲,它是 仍然是 nullptr,但类型不同(char *)。这个空值是 不同于 int * 或 string * 或任何其他指针的空值 类型。我们倾向于将这些 null 值视为 nullptr(或 0), 但每一个都是来自不同类型的不同值。 (由 方式,使用 ==) 进行比较时会发生相同的转换。

那么有哪些不同的空指针类型呢?真的有关系吗 ?在任何检查中(我们想确定某些内容是否为空)是否足以简单地检查 if == to std::nullptr ?

【问题讨论】:

  • So what are the different null pointer types ? 没有多大意义,因为(正如你的报价告诉你的那样)它是任何指针类型。所有指针类型都有空值。
  • simply check if == to std::nullptr 除非我遗漏了什么,否则 C++ 中的类型不能与 == 直接比较。 char* 或 int* 永远不会与 nullptr_t 相同
  • nullptr 是一个关键字,所以它不在 std 命名空间中。只有它的类型 std::nullptr_t 在命名空间中。

标签: c++ c++11


【解决方案1】:

没有不同的nullptr 类型。 nullptr 是 std::nullptr_t 类型的值。有不同的指针类型,任何指针类型都可以有一个空值,与nullptr 相比,结果为true。并且指针类型的数量是无限的。由于您可以形成指向任何类型的指针,并且结果本身就是您可以形成指针的类型。 (即您可以拥有int*************************)

在任何检查中是否足够(我们想确定某事是否 为空)来简单地检查 == 是否为 std::nullptr ?

不是std::nullptr,只是nullptr。但除此之外,是的。

【讨论】:

  • 所以当我们与 nullptr 进行比较时,C++ 会检查指针是否为空指针,但实际上并未将其与类型进行比较?
  • @John:第一个是肯定的,我不太确定你说的第二个是什么意思。
  • 好吧,如果有无数种类型,并且我们正在与 nullptr 进行 == 比较,但同时 nullptr 是关键字,而不是类型,那么我们实际上不是与类型比较 - 我们正在检查对象在概念上是否等同于 null。对吗?
  • @John:嗯,是的。我想。但除了模板元编程(在编译时执行)之外,我认为我们从来没有与类型进行比较。运行时比较总是在值上,而不是在类型上。
【解决方案2】:

那么有哪些不同的空指针类型呢?

只有一种空指针类型,nullptr_t。

真的很重要吗?

由于空指针只有一种类型,所以这个问题没有实际意义。

在任何检查中(我们想确定某些内容是否为空)是否足以简单地检查 if == 到 std::nullptr ?

没有像std::nullptr 这样的东西。 nullptr 是一个关键字。 它是std::nullptr_t类型的纯右值。

是的,任何指针都可以与nullptr进行比较。

【讨论】:

    【解决方案3】:

    有一个类型std::nullptr_t。它不是指针类型。尽管如此,我们还是将这种类型的实例(例如nullptr)称为“空指针常量”。

    对于T 的每一种类型,T* 都是一个不同的指针类型,并且有一个该类型的空指针。

    从nullptr_t 到任何指针类型都有合适的转换,允许我们在需要空指针常量时使用nullptr。例如

    int *ptr = nullptr; // initialize to be the null pointer of type int*
    

    【讨论】:

      猜你喜欢
      • 2017-10-07
      • 2013-06-23
      • 2010-09-27
      • 2012-01-17
      • 2013-09-12
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多