Namespaces
Variants

std::nullptr_t

ja.cppreference.net より
< cpp | 型
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
入れ替え と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通の語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
ヘッダ <cstddef>
using nullptr_t = decltype(nullptr);
で定義 (C++11以降)

std::nullptr_t は、ヌルポインタリテラル nullptr の型です。これは、それ自身がポインタ型でもメンバポインタ型でもない、明確に区別された型です。この型のprvalueはヌルポインタ定数であり、任意のポインタ型およびメンバポインタ型に暗黙変換される可能性があります。

sizeof(std::nullptr_t) は sizeof(void *) と等しいです。

注記

C++標準は、 <stddef.h> が <cstddef> の内容をグローバル名前空間に配置することを要求しており、それにより <stddef.h> がインクルードされた際に nullptr_t がグローバル名前空間で利用可能であることを要求します。

nullptr_t はC23までC言語の一部ではありません。

std::nullptr_tの宣言が他の標準ライブラリヘッダで利用可能かどうかは未規定です。実装は、たとえばstd::nullptr_tの代わりに decltype ( nullptr ) を使用するなどして、規格がstd::nullptr_tの使用を要求する場合でも、この名前の導入を回避することができます。

例

2つ以上のオーバーロードが異なるポインタ型を受け取る場合、 std::nullptr_t のオーバーロードが必要であり、これによってnullポインタ引数を受け取ることが可能になります。

#include <cstddef>
#include <iostream>
void f(int*)
{
    std::cout << "Pointer to integer overload\n";
}
void f(double*)
{
    std::cout << "Pointer to double overload\n";
}
void f(std::nullptr_t)
{
    std::cout << "null pointer overload\n";
}
int main()
{
    int* pi{};
    double* pd{};
    f(pi);
    f(pd);
    f(nullptr); // would be ambiguous without void f(nullptr_t)
    // f(0);    // ambiguous call: all three functions are candidates
    // f(NULL); // ambiguous if NULL is an integral null pointer constant 
                // (as is the case in most implementations)
}

出力:

Pointer to integer overload
Pointer to double overload
null pointer overload

関連項目

nullptr (C++11) ヌルポインタ値を指定するポインタリテラル
実装定義のヌルポインタ定数
(マクロ定数)
(C++11) ( DR* )
型が std::nullptr_t かどうかをチェックする
(クラステンプレート)
Cドキュメント for nullptr_t