Casting — C ++, как мне не дать компилятору делать неявные преобразования при вызове функций?

Вот сделка:

Когда у меня есть функция с аргументами по умолчанию, как этот

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)

Есть ли такой метод?

1

Решение

Нет, такого метода нет. Шаблон хорош для такой вещи, я думаю. Однако в gcc, например, есть флаг -Wconversion-nullи для кода с foo(1, false) это даст предупреждение

преобразование «false» в тип указателя для аргумента 2 «int foo (int,
int *, bool) »[-Wconversion-null]

а в лязге есть флаг -Wbool-conversion

инициализация указателя типа ‘int *’ в null из константы
логическое выражение [-Wbool-преобразование]

4

Другие решения

Лучший способ — правильно установить уровень предупреждения, а не игнорировать предупреждения.

Например, 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);
3

По вопросам рекламы [email protected]