Компилятор не предупреждает вас, потому что он знает во время компиляции , что это преобразование, если безопасно , т.е. исходное и целевое значение идентичны. Когда вы делаете:
vec[1.0F]
С точки зрения компилятора не происходит изменения значения (потеря точности) между 1.0F
и 1
, поэтому компилятор не предупреждает вас. Если вы попробуете:
vec[1.2F]
... компилятор предупредит вас, потому что даже если 1.2F
будет преобразовано в 1
, потеря точности.
Если вы используете значение, которое не известно во время компиляции, например ::
float get_float();
vec[get_float()];
Вы получите предупреждение, как и ожидалось, потому что компилятор не знает заранее значение get_float()
и, следовательно, не может быть уверен, что преобразование безопасно .
Обратите внимание, что вы никогда не получите такого предупреждения, когда ожидаются константные выражения (например, в std::array<int, 10>
), потому что, по определению, константные выражения известны во время компиляции, поэтому компилятор знает, есть ли проблема между заданным значение и преобразованное.