【问题标题】:How Does void Work With Type Aliassing?void 如何处理类型别名?
【发布时间】:2016-12-22 22:29:42
【问题描述】:

我一直在仔细阅读类型别名的规则:http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing 我特别对最后一条规则有疑问,我们可以将其转换为:

charunsigned char:这允许将任何对象的对象表示检查为unsigned char 的数组

我注意到这包含void 类型。难道我们不能将任何东西投射到void 并返回吗?

【问题讨论】:

  • 您可以投射到void* 并返回。
  • 不禁止将指针转换为不相关的类型。取消引用结果并使用值是。
  • 如果我的回答听起来居高临下,我深表歉意。显然你对 c++ 的了解比我多,但我想确保任何阅读它的人都能理解答案,所以我把事情简化了一点。
  • 混叠与您投射的内容无关。这是关于“检查对象表示”。也就是说,取消引用指针。

标签: c++ casting void-pointers reinterpret-cast type-alias


【解决方案1】:

在这种情况下没有类型别名,因为您无法通过void* 检查对象。为此,您必须取消对void* 的引用,但这是不允许的。 void 在任何情况下都是不完整的类型,您不能取消引用指向不完整类型的指针。

【讨论】:

    【解决方案2】:

    void 是不完整的类型。永远不可能有 void 类型的对象。

    【讨论】:

    • 它不仅不完整,而且永远无法完成。这与int[] 不同,后者当然可以是泛左值的类型(但不是纯右值)。
    【解决方案3】:

    void 很奇怪,因为您可以声明 void*,但您很少在函数定义的上下文之外单独使用 void。从这个意义上说,它是一个不完整的类型,因此它本身没有真正的意义。 void 真的只是为了语法而存在。

    从技术上讲,您可以将类型转换为 void

    int i = 0;
    (void)i;
    

    但这实际上是一个无操作。当有人试图隐藏有关未使用变量的编译器警告时,您可能会看到这一点。您不能将结果转换回其原始类型,因为它不会产生结果。

    您还可以将指针转换为void* 并将其声明为,这意味着它可以是指向任何东西的指针(有一些例外)。但是,在将其转换为完整类型之前,您无法取消引用它,例如 unsigned char

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多