nullptr

定義

在C语言中,空指標可以使用(void *)0;來表示,且標準庫中也是如此定義,但在C++语言中,由于对语法的类型检查更为严格,因而空指针的值就不能表示为(void *)0;。例如,空指针的值表示为FILE *fp=(void *)0;编译报错。所以至少自C++98开始#define NULL 0。 但这会在函数重载时遇到新的困难。例如

void foo(char c, void *p);
void foo(char c, int i);
int main()
{
    foo('x',NULL);//匹配哪个版本的foo()?
}

C++11开始,定义了空指针的常值为nullptr,解决了上述函数重载问题。

在没有C++11的nullptr时,可以自己实现一个[4]

const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }

    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
    void operator&() const;
} nullptr = {};

C++语言标准规定:[5] 值0或std::nullptr_t类型的纯右值是空指针常量(null pointer constant)。可以通过空指针转换(null pointer conversion)成为某个类型的空指针值(null pointer value)。

C++语言标准还规定,[6]在实参个数多于形参个数时(即可变参数个数的函数调用,可用va_arg来访问),多出来的实参如果是std::nullptr_t类型,则转化为(void *)0供函数访问。

std::nullptr_t定义在标准头文件<cstddef>中。但实际上在源程序中不包含该头文件仍可以正常使用nullptr_t类型与nullptr对象。

nullptr_t

nullptr_t是字面常數nullptr的資料型態[7]。它是一種特殊的類型,並不是一種指標類型也不是指向任何種變數型態的指標類型。nullptr_t位於std命名空間中,且定義於<cstddef>標頭檔中[8]。可透過is_null_pointer來檢查物件是否為這種型態[9]

參見

参考文献

  1. (PDF). stroustrup.com. 2003-9-10 [2018-09-09]. (原始内容存档 (PDF)于2017-07-05).
  2. . Embedded Template Library. [2018-09-09]. (原始内容存档于2018-09-09).
  3. . [2018-09-09]. (原始内容存档于2018-09-09).
  4. 《Imperfect C++ --- Practical Solutions for Real-Life Programming》 作者: 威尔逊 译者: 荣耀 / 刘未鹏 人民邮电出版社 2006年1月 ISBN 9787115136848
  5. 《C++14语言标准》4.10.1
  6. 《C++14语言标准》5.2.2.7
  7. . cplusplus.com. [2018-09-09]. (原始内容存档于2018-03-24).
  8. . IBM. [2018-09-09]. (原始内容存档于2018-09-09).
  9. . cplusplus.com. [2018-09-09]. (原始内容存档于2018-03-12).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.