我了解到nullptr
,除了可以转换为任何指针类型(但不能转换为任何整数类型)之外,它还有自己的类型std::nullptr_t
。所以有可能有一个接受的方法重载std::nullptr_t
。
究竟为什么需要这样的过载?
如果多个重载接受指针类型,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
}
在某些特殊情况下,与nullptr_t
类型进行比较有助于指示对象是否有效。
例如,operator==
andoperator!=
的重载std::function
只能nullptr_t
作为参数来判断函数对象是否为空。有关更多详细信息,您可以阅读此问题。
另外,你会给它什么其他类型,而不是简单地重新引入我们遇到的问题NULL
?关键是要摆脱讨厌的隐式转换,但我们实际上不能改变旧程序的行为,所以我们就在这里。
引入该类型是为了避免整数零和空内存之间的混淆。和往常一样, 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的一种方法。