`std::nullptr_t`类型有什么用途?

36
我了解到,除了可以转换为任何指针类型(但不能转换为任何整数类型)之外,nullptr本身还有其自己的类型std::nullptr_t。因此,可以有一个方法重载接受std::nullptr_t
究竟为什么需要这样的重载呢?
4个回答

49
如果有多个重载接受指针类型,那么需要一个接受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
}

6
用nullptr进行类型转换,比如 f((int*)nullptr); f((char*)nullptr);,能解决不明确性吗? - Dai
6
@Dai:当然可以,但这对用户来说会很笨重。 - Thomas Eding
1
这些强制类型转换仍然可以被用于有意地选择其他两个重载函数中的一个。 - Aconcagua
如果我有一个指向0的char*呢?这个重载会失败,不是吗?它将被传递到第二个版本。前两个函数都必须明确检查它们没有被传递空指针,以便安全,所以你最好在那里处理这种情况。如果有一些第三方行为需要使用null作为参数,那么你可以只使用void f(void),对吧? - fpf3

5

有一些特殊情况下,使用 nullptr_t 类型进行比较是有用的,以指示对象是否有效。

例如,std::functionoperator==operator!= 重载只能采用 nullptr_t 作为参数,以判断函数对象是否为空。更多细节可以参阅这个问题


2
此外,你会给它什么其他类型,以避免重新引入我们在NULL中遇到的问题?整个重点是摆脱令人讨厌的隐式转换,但我们实际上不能改变旧程序的行为,所以我们只能这样做。"最初的回答"

-1

这种类型被引入是为了避免整数零和空内存之间的混淆。而且像往常一样,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*增量和许多其他操作。

这让我想到:C++有太多的称谓和混淆。到了一个地步,其中一种编译器与同一版本的另一个编译器的代码兼容性不一致。一个编译器的静态库不能与另一个编译器一起使用。没有理由它必须是这样的。我认为这只是帮助消灭C++的一种方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接