У меня есть следующее:
void func(const char *p) { std::cout << p << "\n"; }
void func(std::nullptr_t p) { std::cout << "<null>\n"; }
int main()
{
func("test");
char *p=nullptr;
func(p);
func(nullptr);
return 0;
}
func("test")
всегда вызывается. С func(p)
комментировал, func(nullptr)
называется, но когда func(p)
не комментируется ни один из них не называются. Почему нет? Почему func(p)
с p == nullptr не вызывает func (nullptr), но вместо вызовов func (const char *)?
[редактировать]
Основываясь на ответах, мой вывод состоит в том, что func (...) вызывается на основе типа параметра, а p
имеет тип char*
, значение p для значения nullptr не изменяет тип и не изменяет этот func (char * ) называется, как объясняется и принятый ответ.
Точное содержание вашего вопроса на самом деле глубоко замалчивается в настоящее время, потому что причина, по которой вы видели вещи, "не вызываемые", заключалась в том, что ваш исходный код пытался передать указатель нулевого символа, который устанавливает флаг ошибки в потоке и препятствует его работе снова, пока он не будет исправлен. Во всяком случае, вот суть ответа:
Вы не можете назначить nullptr
на char*
и ожидать, что char*
, чтобы волшебным образом превратить в std::nullptr_t
. Ваш указатель по-прежнему является char*
, и он имеет значение nullptr
.
Преимущество std::nullptr_t
заключается в том, что литерал нулевого указателя имеет свой собственный отдельный тип, который не преобразуется в целые типы; это не означает, что вы можете ожидать использования типа std::nullptr_t
везде, где указатель имеет значение 0
.
func(p)
использует нулевой указатель, который является неопределенным поведением. Что происходит, когда вы делаете это изменение? Смотрите ideone.com/gSNG6m