C ++ неявное преобразование типов в Visual Studio 2010 - PullRequest
11 голосов
/ 25 февраля 2011

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

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

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

Ответы [ 2 ]

7 голосов
/ 25 февраля 2011

Вы можете оставить исходную функцию невыполненной:

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

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

6 голосов
/ 25 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...