Вот сделка:
Когда у меня есть функция с аргументами по умолчанию, как этот
int foo (int a, int*b, bool c = true);
Если я по ошибке называю это так:
foo (1, false);
Компилятор преобразует false в указатель на int и вызывает функцию, где b указывает на 0.
Я видел, как люди предлагают шаблонный подход для предотвращения неявного преобразования типов:
template <class T>
int foo<int> (int a, T* b, bool c = true);
Но такой подход слишком запутан и делает код запутанным.
Существует явное ключевое слово, но оно работает только для конструкторов.
То, что я хотел бы, это чистый метод для выполнения этого аналогично явному методу, поэтому, когда я объявляю метод следующим образом:
(keyword that locks in the types of parameters) int foo (int a, int*b, bool c = true);
и назовите это так:
foo (1, false);
компилятор даст мне это:
foo (1, false);
^
ERROR: Wrong type in function call (expected int* but got bool)
Есть ли такой метод?
Нет, такого метода нет. Шаблон хорош для такой вещи, я думаю. Однако в gcc, например, есть флаг -Wconversion-null
и для кода с foo(1, false)
это даст предупреждение
преобразование «false» в тип указателя для аргумента 2 «int foo (int,
int *, bool) »[-Wconversion-null]
а в лязге есть флаг -Wbool-conversion
инициализация указателя типа ‘int *’ в null из константы
логическое выражение [-Wbool-преобразование]
Лучший способ — правильно установить уровень предупреждения, а не игнорировать предупреждения.
Например, gcc, имеет -Wall
опция, которая обрабатывает множество проблемных случаев и покажет следующее предупреждение в вашем случае (g ++ 4.8.1):
garbage.cpp: In function ‘int main(int, char**)’:
garbage.cpp:13:13: warning: converting ‘false’ to pointer type for argument 2 of ‘int foo(int, int*, bool)’ [-Wconversion-null]
foo(0,false);