Со встроенными (не классовыми) типами невозможно предотвратить нежелательные неявные преобразования типов.
Некоторые компиляторы могут быть настроены на выдачу предупреждений об операциях, связанных с подозрительными преобразованиями, но это не распространяется на все возможные неявные преобразования (в конце концов, преобразование из 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
).
Это в основном означает, что можно предотвратить неявное преобразование в типы классов, но не предотвратить продвижение в выражениях с числовыми операторами.
person
Peter
schedule
09.11.2016