2016-02-22 10 views
2

Можно ли запретить неявное преобразование базовых типов в C++? В частности, я хотел бы запретить неявное преобразование из unsigned в float или double из-за ошибок, подобные этим:Запрет неявного преобразования `unsigned` в` double`

int i = -5; 
... 
unsigned u = i; // The dawn of the trouble. 
... 
double d = u; // The epicenter of the bug that took a day to fix. 

Я пытался что-то вроде этого:

explicit operator double(unsigned); 

К сожалению, это не сработало :

explicit.cpp:1: error: only declarations of constructors can be ‘explicit’ 
explicit.cpp:1: error: ‘operator double(unsigned int)’ must be a nonstatic member function 

ответ

5

Вы не можете просто удалить неявное стандартное преобразование с языка в целом.

Сказав это, есть способы предотвратить нежелательные преобразования в некоторых ситуациях. Во время инициализации вы можете предотвратить сужение конверсий с помощью синтаксиса привязки. Преобразование между плавающим и интегральным типами всегда считается сужающимся (редактирование: кроме случаев, когда источником является целочисленное постоянное выражение).

int i {-5};  // ok; -5 fits in an int 
unsigned u = i; // ok; no check for narrowing using old syntax 
double d {u};  // error: narrowing 

Если вы пишете функцию, которая принимает double, вы можете предотвратить прохождение интегрального типа путем добавления перегрузок для целочисленных типов, то их удаления.