VC++: инициализация объекта выражением с int/uint
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 22.03.22 18:03
Оценка:
Есть у меня мелкий класс, хранящий 64-разрядные значения. Если в классе определить только самые общие конструкторы с параметрами int64 и uint64, то объект невозможно инициализировать просто числовым литералом вроде "-100", или выражением типа int/uint — комплилятор (MSVC) отказывается автоматически преобразовывать тип, требуя явного преобразования.

Если же добавить конструкторы с параметрами int, uint, long, ulong, пометив их explicit, то все прекрасно, пока я не пытаюсь инициализировать объект выражением вроде "-10 * n", где n — unsigned int. По правилам языка, такое выражение приводится к unsigned int, для него вызывается соответствующий конструктор, который выполняет беззнаковое расширение, хотя по смыслу требуется знаковое. Постоянно держать в уме такие мелочи напряжно, и я периодически об этом нюансе забываю. У компилятора предупреждения на этот счет не предусмотрено.

Можно ли как-то обезопасить себя от таких ошибок средствами языка? И, кстати, более другие компиляторы умеют выдавать предупреждение в такой ситуации?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.