std::nullptr_t
Определено в заголовочном файле <cstddef>
|
||
using nullptr_t = decltype(nullptr); |
(начиная с C++11) | |
std::nullptr_t
это тип литерала нулевого указателя, nullptr. Это особый тип, который сам по себе не является типом указателя или указателем на тип элемента. Его значениями являются константы нулевого указателя (смотрите NULL), и он может быть неявно преобразован в любой указатель и указатель на тип элемента.
sizeof(std::nullptr_t) равно sizeof(void *).
[править] Примечание
Стандарт C++ требует, чтобы <stddef.h> помещал содержимое <cstddef> в глобальное пространство имён и, таким образом, требует доступности std::nullptr_t
в глобальном пространстве имён при включении <stddef.h>.
std::nullptr_t
не является частью C до C23.
[править] Пример
Если две или более перегрузок принимают разные типы указателей, необходима перегрузка для std::nullptr_t
, чтобы принять аргумент нулевого указателя.
#include <cstddef> #include <iostream> void f(int*) { std::cout << "Перегрузка указатель на int\n"; } void f(double*) { std::cout << "Перегрузка указатель на double\n"; } void f(std::nullptr_t) { std::cout << "Перегрузка нулевой указатель\n"; } int main() { int* pi {}; double* pd {}; f(pi); f(pd); f(nullptr); // было бы неоднозначно без void f(nullptr_t) // f(0); // неоднозначный вызов: все три функции являются кандидатами // f(NULL); // неоднозначно, если NULL является целочисленной константой // нулевого указателя (как и в большинстве реализаций) }
Вывод:
Перегрузка указатель на int Перегрузка указатель на double Перегрузка нулевой указатель
[править] Смотрите также
nullptr(C++11) | литерал указателя, задающий нулевое значение указателя |
определяемая реализацией константа для нулевого указателя (макроконстанта) | |
(C++14) |
проверяет, является ли тип std::nullptr_t (шаблон класса) |
Документация C по nullptr_t
|