С встроенных типов (не класс), не представляется возможным, чтобы предотвратить нежелательные неявные преобразования типов.
Некоторых компиляторов может быть настроен, чтобы дать предупреждения для операций, связанных с подозрительными переходами, но это не распространяется на все возможные неявные преобразования (в конце концов, переход от short
к long
является значение сохранения, поэтому не все компиляторы сообщат об этом как подозрительном). И некоторые из этих компиляторов также могут быть настроены так, чтобы давать ошибки, где они дают предупреждения.
С типами классов C++ можно предотвратить неявные преобразования путем создания конструкторов explicit
и не определять операторы преобразования (например, функцию члена класса с именем operator int()
).
Также возможно, чтобы тип класса предоставлял числовые операторы (operator+()
и т. Д.), Которые принимают только операнды требуемых типов. Проблема в том, что это не обязательно препятствует продвижению встроенных типов, участвующих в таких выражениях. Например, класс, который предоставляет operator+(int) const
(так работает some_object = some_other_object + some_int
), не остановит выражение, подобное some_other_object + some_short
, из компиляции (поскольку some_short
может быть неявно повышена до int
).
В основном это означает, что можно предотвратить неявное преобразование типов классов, но не препятствовать продвижению в выражениях с числовыми операторами.
Вы пробовали -Wpedantic? – themagicalyang
Добавьте -Werror в свою сборку, чтобы превратить эти предупреждения в жесткие ошибки. – StoryTeller