跳至內容

nullptr

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

nullptr
基本資料
所屬概念空指標
種類字面常數
語言C++
詳細資料
語法nullptr
型態std::nullptr_t
標頭檔nullptr.h (C++11之前)
首次出現C++11

nullptrC++11語言標準用來表示空指標常數值[1],可以指派給任意類型的指標變數[2]。部分編譯器將之視為一個關鍵字,例如Visual Studio[3],部分使用舊標準的C++編譯器則未實作需要自行定義[4]或引入額外的標頭檔[2]

定義

[編輯]

在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. ^ A name for the null pointer: nullptr (PDF). stroustrup.com. 2003-09-10 [2018-09-09]. (原始內容存檔 (PDF)於2017-07-05). 
  2. ^ 2.0 2.1 nullptr. Embedded Template Library. [2018-09-09]. (原始內容存檔於2018-09-09). 
  3. ^ nullptr (C++ Component Extensions). [2018-09-09]. (原始內容存檔於2018-09-09). 
  4. ^ 4.0 4.1 《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. ^ std::nullptr_t. cplusplus.com. [2018-09-09]. (原始內容存檔於2018-03-24). 
  8. ^ Null pointers. IBM. [2018-09-09]. (原始內容存檔於2018-09-09). 
  9. ^ std::is_null_pointer. cplusplus.com. [2018-09-09]. (原始內容存檔於2018-03-12).