【问题标题】:What are the uses of the type `std::nullptr_t`?`std::nullptr_t` 类型的用途是什么?
【发布时间】:2012-08-17 11:58:05
【问题描述】:

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

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

【问题讨论】:

    标签: c++ c++11 nullptr


    【解决方案1】:

    如果多个重载接受一个指针类型,则std::nullptr_t 的重载对于接受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 来解决歧义吗?例如f( (int*)nullptr ); f( (char*)nullptr ); ?
    • @Dai:当然,但这对用户来说会很笨重。
    • 不过,这些类型转换仍可用于选择其他两个重载之一。
    【解决方案2】:

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

    例如,std::function 的operator== and operator!= 重载只能以nullptr_t 作为参数来判断函数对象是否为空。更多详情请阅读this question。

    【讨论】:

      【解决方案3】:

      另外,你会给它什么其他类型,而不是简单地重新介绍我们在NULL 中遇到的问题?关键是要摆脱令人讨厌的隐式转换,但我们实际上无法改变旧程序的行为,所以我们来了。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-22
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 2015-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多