Перегруженная функция с нулевым вызовом не вызывается

0

У меня есть следующее:

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 * ) называется, как объясняется и принятый ответ.

  • 2
    Похожие страницы : stackoverflow.com/questions/23283772/…
  • 0
    Можете ли вы изменить его, чтобы не пытаться использовать нулевой указатель func(p) использует нулевой указатель, который является неопределенным поведением. Что происходит, когда вы делаете это изменение? Смотрите ideone.com/gSNG6m
Показать ещё 6 комментариев
Теги:
nullptr

1 ответ

3
Лучший ответ

Точное содержание вашего вопроса на самом деле глубоко замалчивается в настоящее время, потому что причина, по которой вы видели вещи, "не вызываемые", заключалась в том, что ваш исходный код пытался передать указатель нулевого символа, который устанавливает флаг ошибки в потоке и препятствует его работе снова, пока он не будет исправлен. Во всяком случае, вот суть ответа:


Вы не можете назначить nullptr на char* и ожидать, что char*, чтобы волшебным образом превратить в std::nullptr_t. Ваш указатель по-прежнему является char*, и он имеет значение nullptr.

Преимущество std::nullptr_t заключается в том, что литерал нулевого указателя имеет свой собственный отдельный тип, который не преобразуется в целые типы; это не означает, что вы можете ожидать использования типа std::nullptr_t везде, где указатель имеет значение 0.

  • 0
    Да, я пришел к такому выводу. Жаль, что это не так, решил бы много проблем, если бы это было возможно ... :)
  • 0
    @slashmais C ++ имеет статическую систему типов, вы не можете использовать ее, чтобы узнать о свойствах среды выполнения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню