我知道C ++中的不同的转换操作符已经在这里多次讨论了,但我的问题是关于在 数字类型 之间进行转换,而不是关于一般差异C风格和C ++风格的运算符之间。我认为这是一个完全不同的主题,而不是在类层次结构中进行转换。
假设我想将一个int i
转换为double,我有一些选项
static_cast<double>(i)
(double) i
double(i)
在这种情况下,我个人更喜欢第3行中类似构造函数的样式,因为我想表达这不是一个演员类型类型,我当然会使用static_cast
或dynamic_cast
。
除了在文本编辑器中搜索时难以找到这种类型的演员表,我选择有任何缺点吗?
答案 0 :(得分:4)
static_cast<double>(i)
肯定是你在这种特殊情况下最明确表达的意思。
在数字类型之间进行转换时,您通常会远离未定义的行为。所以一般要小心。虽然为i
的每个可能值定义了广告素材,但将double
投放到int
可以溢出int
,并且该行为是在C ++中未定义。
我总是建议您检查目的地类型是否可以容纳源类型。 std::numeric_limits<>::max()
等可以在这里提供帮助。
C ++标准未指定int
的最大大小(尽管16,32和64位2的补码是常见的),因此,它可能无法表示为double
。< / p>
在我的代码中,我有一个包含
的命名空间 template<
typename T/*the desired type*/,
typename/*the source type*/ Y
> T integral_cast(const Y& y)
{
static_assert(false, "undefined integral_cast");
}
我专注于我需要的每个数字演员。
答案 1 :(得分:3)
这些方法的一个主要缺点是强制转换不能防止溢出和其他数字错误。
使用static_cast
是直接理智的解决方案,静态代码分析工具(如PVS studio)不会标记此方法。 (double)i
方法会生成警告。
最安全的方法可能是让你自己的演员说numeric_cast<T>()
template <class OT, class ST>
OT numeric_cast(const ST value)
{
return static_cast<OT>(value);
}
此函数的优点是您可以执行绑定检查和其他数字检查,以确保强制转换是合法的,并且不会返回(或获取)垃圾值。
还有另一种处理数字的方法,但它只适用于不变的编译时值。对于此检查user defined string literals