我了解到,除了可以转换为任何指针类型(但不能转换为任何整数类型)之外,
究竟为什么需要这样的重载呢?
nullptr
本身还有其自己的类型std::nullptr_t
。因此,可以有一个方法重载接受std::nullptr_t
。究竟为什么需要这样的重载呢?
nullptr
参数的std::nullptr_t
重载。如果没有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
类型进行比较是有用的,以指示对象是否有效。
例如,std::function
的 operator==
和 operator!=
重载只能采用 nullptr_t
作为参数,以判断函数对象是否为空。更多细节可以参阅这个问题。
NULL
中遇到的问题?整个重点是摆脱令人讨厌的隐式转换,但我们实际上不能改变旧程序的行为,所以我们只能这样做。"最初的回答"这种类型被引入是为了避免整数零和空内存之间的混淆。而且像往常一样,cpp让你可以访问该类型。而Java只让你访问该值。它真的并不重要你找到了它的目的。我通常将其用作函数重载中的令牌。
但是我对cpp null const的实现有些问题。
为什么他们不继续使用NULL或null?那个定义已经被用于这个目的了。那么那些已经在使用nullptr表示其他含义的代码怎么办。
更不用说nullptr太长了。大多数情况下,它很烦人且难看。6个字符只是为了默认初始化一个变量。
引入nullptr后,你会认为零不再同时是整数和空指针常量。然而,零仍然存在这种令人讨厌的歧义。因此,我不认为这个新的nullptr值有意义。如果你定义一个可以接受整数或char指针的函数,并将零传递给该函数调用,编译器将抱怨它完全不明确!我也不认为转换为整数会有所帮助。
最后,真让人沮丧的是nullptr_t是std命名空间的一部分,而不是一个关键字。事实上,我才刚刚学到这个事实,尽管我已经在我的函数中使用nullptr_t有很长时间了。CodeBlocks附带的MinGW32允许您在std命名空间中使用nullptr_t。事实上,MinGW32还允许void*增量和许多其他操作。
f((int*)nullptr); f((char*)nullptr);
,能解决不明确性吗? - Daivoid f(void)
,对吧? - fpf3