数字类型之间的C++转换

Fra*_*fer 9 c++ casting

我知道C++中的不同的转换操作符已经在这里讨论了很多次,但我的问题是关于数字类型之间的转换,而不是C风格和C++风格操作符之间的一般差异.我认为这是一个完全不同的主题,而不是在类层次结构中进行投

假设我想将一个int i转换为double,我有一些选项

static_cast<double>(i)
(double) i
double(i)
Run Code Online (Sandbox Code Playgroud)

就个人而言,在这种情况下,我更喜欢第3行中类似于构造函数的样式,因为我想表达这不是演员类型类型,我当然会使用static_castdynamic_cast.

除了在文本编辑器中搜索时难以找到这种类型的演员表,我选择的任何缺点都有吗?

Bat*_*eba 4

static_cast<double>(i)在这种特殊情况下,这无疑是最清楚地表达了您的意图。

在数字类型之间进行转换时,您通常距离未定义的行为只有一步之遥。所以一般情况下要小心。尽管您的转换是为 的每个可能值定义的i,但将 a 转换double为 anint 可能会溢出int,并且该行为在 C++ 中未定义。

我总是建议您检查目标类型是否可以容纳源类型。std::numeric_limits<>::max()等等可以在这里提供帮助。

C++ 标准没有指定最大大小int(尽管 16、32 和 64 位 2 的补码很常见),因此,它可能无法表示为double.

在我的代码中,我有一个名称空间,其中包含

  template<
        typename T/*the desired type*/,
        typename/*the source type*/ Y
    > T integral_cast(const Y& y)
    {
        static_assert(false, "undefined integral_cast");
    }
Run Code Online (Sandbox Code Playgroud)

我专门用于我需要的每个数字转换。

  • `static_cast` 不会保护你免受这里未定义行为的影响。在这个特殊情况下,OP 为他们首选的演员阵容给出了很好的观点。 (2认同)