【问题标题】:How can static_cast can cast an int to char but not reinterpret_cast?static_cast 如何将 int 转换为 char 但不能 reinterpret_cast?
【发布时间】:2013-02-17 17:46:51
【问题描述】:

我不确定之前是否有人问过,但我相信一定是这样。考虑问题开头的简单行:

int a ;
char b = reinterpret_cast<char> (a);

我了解reinterpret_cast 将 x 类型的位模式解释为 y 类型,当然由于大小不匹配,它不应该工作,实际上它不工作。

现在考虑另一个代码:

int a ;
char b = static_cast<char> (a);

这行得通! .现在我的问题是它如何工作?我的意思是编译器会砍掉这些位吗? .我确定sizeof(char) &lt; sizeof(int)。如果那样,reinterpret_cast 也应该使用相同的技术?

【问题讨论】:

    标签: c++ type-conversion


    【解决方案1】:

    有一个从intchar 的明确转换;这就是static_cast 所做的。事实上,你不需要演员表。你可以在这里使用一个作业。另一方面,reinterpret_cast 说假装一种类型的对象中的位代表另一种类型的对象;对于某些类型来说没问题(或多或少),但是没有明智的方法可以假装 int 中的位可以在不应用转换的情况下用作 char 中的位,而 reinterpret_cast 不会这样做。

    【讨论】:

    • "... 而reinterpret_cast 不会这样做"。规范的哪一部分是这样说的?
    • @Nawaz,定义reinterpret_cast允许的转换的部分,显然,你希望它在哪里说呢? [expr.reinterpret.cast] "下面列出了可以使用reinterpret_cast 显式执行的转换。不能使用reinterpret_cast 显式执行其他转换。"
    • 尽管它的名字看起来很广,reinterpret_cast 是相当有限的。正如@JonathanWakely 指出的那样,它可以做的事情有一个列表(基本上涉及指针和引用的事情),并且不允许其他任何事情。 5.2.10 [expr.reinterpret.cast]。一点也不像 C 风格的演员...
    【解决方案2】:

    static_cast 可以强制发生已定义的转换,也可以反转已定义的转换(添加或删除 const/volatile 除外)。你认为 reinterpret_cast 是一些可以做任何事情的超级演员。事实并非如此。它有一组定义的转换。

    它可以将一种类型的指针转​​换为另一种类型的指针(只要保留 const/volatile)。对于引用,它同样可以这样做。它可以将指针转换为整数类型,反之亦然。

    除此之外,它什么也不做,而且你的程序格式不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2013-01-19
      • 2017-05-10
      • 1970-01-01
      • 2017-03-21
      • 2021-09-09
      • 2011-04-09
      • 2018-05-15
      相关资源
      最近更新 更多