30

我了解到nullptr,除了可以转换为任何指针类型(但不能转换为任何整数类型)之外,它还有自己的类型std::nullptr_t。所以有可能有一个接受的方法重载std::nullptr_t

究竟为什么需要这样的过载?

4

4 回答 4

39

如果多个重载接受指针类型,std::nullptr_t则需要重载 for 才能接受nullptr参数。如果没有std::nullptr_t重载,那么在传递时应该选择哪个指针重载将是模棱两可的nullptr

例子:

void f(int *intp)
{
    // Passed an int pointer
}

void f(char *charp)
{
    // Passed a char pointer
}

void f(std::nullptr_t nullp)
{
    // Passed a null pointer
}
于 2012-08-22T05:40:36.710 回答
4

在某些特殊情况下,与nullptr_t类型进行比较有助于指示对象是否有效。

例如,operator==andoperator!=的重载std::function只能nullptr_t作为参数来判断函数对象是否为空。有关更多详细信息,您可以阅读此问题

于 2017-07-30T01:16:05.577 回答
2

另外,你会给它什么其他类型,而不是简单地重新引入我们遇到的问题NULL?关键是要摆脱讨厌的隐式转换,但我们实际上不能改变旧程序的行为,所以我们就在这里。

于 2019-08-21T14:09:52.693 回答
0

引入该类型是为了避免整数零和空内存之间的混淆。和往常一样, cpp 使您可以访问该类型。Java 仅允许您访问该值。你为它找到什么目的并不重要。我通常将它用作函数重载中的标记。

但是我对 cpp null const 的实现有一些问题。

  • 为什么他们不继续使用 NULL 或 null?该定义已被用于该目的。已经将 nullptr 用于其他用途的代码呢?

  • 更不用说 nullptr 太长了。大多数时候打字很烦人,看起来很丑。6 个字符只是为了默认初始化一个变量。

  • 随着 nullptr 的引入,您会认为零不再是整数和空指针 const。然而,零仍然具有令人讨厌的歧义。所以我看不到这个新的 nullptr 值的意义。如果您定义一个可以接受整数或字符指针的函数,并将零传递给该函数调用,编译器会抱怨它完全模棱两可!而且我认为转换为整数不会有帮助。

  • 最后,很糟糕的是 nullptr_t 是 std 命名空间的一部分,而不仅仅是一个关键字。事实上,在我在函数中使用 nullptr_t 多长时间之后,我才刚刚了解到这个事实。CodeBlocks 附带的 MinGW32 允许您使用 nullptr_t 和 std 命名空间。事实上 MinGW32 允许 void* 增量和很多其他事情。

这导致我:cpp 有太多的面额和混乱。以至于与一个编译器的代码兼容性与另一个相同 cpp 版本的不兼容。一个编译器的静态库不能与不同的编译器一起工作。没有理由必须这样。而且我认为这只是帮助杀死cpp的一种方法。

于 2021-08-15T07:30:51.400 回答