Ответ 1
Поведение полностью верно, потому что (как вы заметили) преобразование из false
(действительная константа нулевого указателя) в указатель неявно. Вместо этого попробуйте std::string
.
У меня была функция: void foo(bool boolParam = true)
И я изменил его на: void foo(const char* charParam, bool boolParam = true)
Чтобы избежать поиска, я просто скомпилировал код, надеясь, что компилятор выдаст ошибку (или, по крайней мере, предупреждение), в которой функция была вызвана из-за неправильного типа параметра, но вместо этого компилятор молча преобразовал false в NULL
и скомпилировал все без ошибок или предупреждения. Правильно ли это поведение? Я знаю, что false и NULL
равны 0, но я думаю, что компилятор должен дать хотя бы какое-то предупреждающее сообщение...
Поведение полностью верно, потому что (как вы заметили) преобразование из false
(действительная константа нулевого указателя) в указатель неявно. Вместо этого попробуйте std::string
.
Вы можете оставить свою оригинальную функцию нереализованной:
void foo(bool boolParam = true);
void foo(const char* charParam, bool boolParam = true)
{
// do stuff
}
Теперь, когда вы вызываете foo()
, foo(true)
и foo(false)
, это приведет к ошибке компиляции. Однако foo(NULL)
не будет компилироваться ни потому, что NULL и false являются неоднозначными (а затем мы вернемся к квадрату...).