如果有人被这样的事情抓住,我不会那么惊讶:
float ra[] = {0, CHAR_MAX, SHORT_MAX, INT_MAX, LONG_MAX};
(在我的实现中,最后两个在转换回 int/long 时不会产生相同的结果,因此正在缩小)
不过,我不记得曾经写过这篇文章。只有当极限的近似值对某些东西有用时,它才有用。
这似乎至少也有点似是而非:
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?
假设没有错误,大概修复总是使转换显式。除非你对宏做一些奇怪的事情,否则我认为数组初始值设定项只会出现在数组类型附近,或者至少与表示类型的东西很接近,这可能取决于模板参数。所以演员应该很容易,如果冗长的话。