Я не удивлюсь, если кого-нибудь поймает что-то вроде:
float ra[] = {0, CHAR_MAX, SHORT_MAX, INT_MAX, LONG_MAX};
(в моей реализации последние два не дают одинакового результата при преобразовании обратно в int /долго, следовательно сужаются)
Я не помню, чтобы когда-либо писал это.Это полезно только в том случае, если для чего-то полезно приближение к пределам.
Это кажется, по крайней мере, слишком правдоподобным:
void some_function(int val1, int val2) {
float asfloat[] = {val1, val2}; // not in C++0x
double asdouble[] = {val1, val2}; // not in C++0x
int asint[] = {val1, val2}; // OK
// now do something with the arrays
}
, но это не совсем убедительно, потому что если я знаю, что яимеют ровно два значения, зачем помещать их в массивы, а не просто float floatval1 = val1, floatval1 = val2;
?Какова же мотивация, почему она должна компилироваться (и работать при условии, что потеря точности находится в пределах допустимой точности для программы), а float asfloat[] = {val1, val2};
- нет?В любом случае я инициализирую два числа с плавающей запятой из двух целых, просто в одном случае два числа с плавающей точкой оказываются членами агрегата.
Это выглядит особенно резко в тех случаях, когда непостоянное выражение приводит ксужение преобразования, даже если (в конкретной реализации) все значения типа источника представимы в типе назначения и могут быть преобразованы обратно в их исходные значения:
char i = something();
static_assert(CHAR_BIT == 8);
double ra[] = {i}; // how is this worse than using a constant value?
Если предположить, что ошибки нет, предположительно, исправление всегдасделать преобразование явным.Если вы не делаете что-то странное с макросами, я думаю, что инициализатор массива появляется только близко к типу массива или, по крайней мере, к чему-то, представляющему тип, который может зависеть от параметра шаблона.Так что приведение должно быть легким, если многословным.