Подтвердить что ты не робот

Неявное преобразование типа С++ в Visual Studio 2010

У меня была функция: void foo(bool boolParam = true)

И я изменил его на: void foo(const char* charParam, bool boolParam = true)

Чтобы избежать поиска, я просто скомпилировал код, надеясь, что компилятор выдаст ошибку (или, по крайней мере, предупреждение), в которой функция была вызвана из-за неправильного типа параметра, но вместо этого компилятор молча преобразовал false в NULL и скомпилировал все без ошибок или предупреждения. Правильно ли это поведение? Я знаю, что false и NULL равны 0, но я думаю, что компилятор должен дать хотя бы какое-то предупреждающее сообщение...

4b9b3361

Ответ 1

Поведение полностью верно, потому что (как вы заметили) преобразование из false (действительная константа нулевого указателя) в указатель неявно. Вместо этого попробуйте std::string.

Ответ 2

Вы можете оставить свою оригинальную функцию нереализованной:

void foo(bool boolParam = true);
void foo(const char* charParam, bool boolParam = true)
{
  // do stuff
}

Теперь, когда вы вызываете foo(), foo(true) и foo(false), это приведет к ошибке компиляции. Однако foo(NULL) не будет компилироваться ни потому, что NULL и false являются неоднозначными (а затем мы вернемся к квадрату...).