Каковы применения типа `std:: nullptr_t`?
Я узнал, что nullptr
, помимо преобразования в любой тип указателя (но не какого-либо целостного типа), также имеет свой собственный тип std::nullptr_t
. Таким образом, существует возможность перегрузки метода, которая принимает std::nullptr_t
.
Именно поэтому нужна такая перегрузка?
Ответы
Ответ 1
Если более чем одна перегрузка принимает тип указателя, для принятия аргумента nullptr
необходима перегрузка для std::nullptr_t
. Без перегрузки std::nullptr_t
было бы неоднозначно, какую перегрузку указателя следует выбрать при передаче nullptr
.
Пример:
void f(int *intp)
{
// Passed an int pointer
}
void f(char *charp)
{
// Passed a char pointer
}
void f(std::nullptr_t nullp)
{
// Passed a null pointer
}
Ответ 2
Существуют специальные случаи, когда сравнение с типом nullptr_t
полезно указать, действителен ли объект.
Например, operator==
и operator!=
перегрузки std::function
могут принимать только nullptr_t
в качестве параметра для указания если объект функции пуст. Для более подробной информации вы можете прочитать этот вопрос.
Ответ 3
Кроме того, какой другой тип вы бы назвали, который не просто повторяет проблемы, которые у нас были с NULL
? Весь смысл в том, чтобы избавиться от неприятных неявных преобразований, но мы не можем на самом деле изменить поведение старых программ, поэтому мы здесь.