Каковы применения типа `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? Весь смысл в том, чтобы избавиться от неприятных неявных преобразований, но мы не можем на самом деле изменить поведение старых программ, поэтому мы здесь.