C++0x 将使以下代码和类似代码格式错误,因为它需要所谓的缩小转换范围 of a double
to a int
.
int a[] = { 1.0 };
我想知道这种初始化在现实世界的代码中是否经常使用。此更改会破坏多少代码?如果您的代码受到影响,需要付出很大的努力才能在代码中修复此问题吗?
有关参考,请参阅 n3225 的 8.5.4/6
缩小转换是隐式转换
- 从浮点类型到整数类型,或者
- 从 long double 到 double 或 float,或者从 double 到 float,除非源是常量表达式并且转换后的实际值在可以表示的值范围内(即使无法精确表示),或者
- 从整数类型或无作用域枚举类型到浮点类型,除非源是常量表达式,并且转换后的实际值将适合目标类型,并且在转换回原始类型时将产生原始值,或者
- 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,并且转换后的实际值将适合目标类型并在以下情况下产生原始值:转换回原始类型。
当我使用 GCC 时,我遇到了这个重大变化。编译器打印出如下代码的错误:
void foo(const unsigned long long &i)
{
unsigned int a[2] = {i & 0xFFFFFFFF, i >> 32};
}
功能中void foo(const long long unsigned int&)
:
错误:缩小转换范围(((long long unsigned int)i) & 4294967295ull)
from long long unsigned int
to unsigned int
里面 { }
错误:缩小转换范围(((long long unsigned int)i) >> 32)
from long long unsigned int
to unsigned int
里面 { }
幸运的是,错误消息很简单,修复也很简单:
void foo(const unsigned long long &i)
{
unsigned int a[2] = {static_cast<unsigned int>(i & 0xFFFFFFFF),
static_cast<unsigned int>(i >> 32)};
}
该代码位于外部库中,在一个文件中仅出现两次。我认为重大更改不会影响太多代码。新手可能会get 使困惑, though.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)