Как используется тип std :: nullptr_t?

Я узнал, что nullptr, помимо возможности преобразования в любой тип указателя (но не в любой интегральный тип), также имеет свой собственный тип std::nullptr_t. Таким образом, возможна перегрузка метода, которая принимает std::nullptr_t.

Зачем именно такая перегрузка?


person Hindol    schedule 22.08.2012    source источник


Ответы (3)


Если более чем одна перегрузка принимает тип указателя, необходима перегрузка для std::nullptr_t, чтобы принять аргумент nullptr. Без перегрузки 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
}
person torrey.lyons    schedule 22.08.2012
comment
Разве нельзя решить двусмысленность путем приведения значения nullptr? например f( (int*)nullptr ); f( (char*)nullptr );? - person Dai; 27.08.2012
comment
@Dai: Конечно, но это будет неудобно для пользователей. - person Thomas Eding; 31.07.2014
comment
Однако эти преобразования все еще можно использовать для выбора одной из двух других перегрузок. - person Aconcagua; 03.06.2016

В некоторых особых случаях сравнение с типом nullptr_t полезно для определения допустимости объекта.

Например, перегрузки operator== и operator!= могли только возьмите nullptr_t в качестве параметра, чтобы определить, является ли объект функции пустым. Для получения дополнительной информации вы можете прочитать этот вопрос.

person neuront    schedule 30.07.2017

Кроме того, какой еще тип вы бы дали ему, который не просто повторяет проблемы, которые у нас были с NULL? Все дело в том, чтобы избавиться от неприятных неявных преобразований, но мы не можем на самом деле изменить поведение старых программ, так что вот и мы.

person Lightness Races in Orbit    schedule 21.08.2019