У меня есть следующее:
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*)?
[edit]
Основываясь на ответах, я пришел к выводу, что func(...) вызывается на основе типа параметра, а p
имеет тип char*
, установка значения p на nullptr не меняет тип и не будет измените, что вызывается func (char *) - как также объясняет принятый ответ.
func(p)
использует нулевой указатель, который является неопределенным поведением. Что происходит, когда вы делаете это изменение? См. ideone.com/gSNG6m. - person Dave S   schedule 09.06.2014func
вызывать во время компиляции, поэтому невозможно, чтобы это основывалось на текущем значении переменной-аргумента — только на ее статическом типе. - person dlf   schedule 09.06.2014