std::nullptr_t
From cppreference.com
| ヘッダ <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) を代わりに記述することで、この名前を導入しないようにすることができます。
[編集] 例
2つ以上のオーバーロードが異なるポインタ型を受け入れる場合、ヌルポインタ引数を受け入れるためには std::nullptr_t 用のオーバーロードが必要です。
このコードを実行
#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 ドキュメント (nullptr_t について)
| |