void 如何使用类型别名?

How Does void Work With Type Aliassing?

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

char or unsigned char: this permits examination of the object representation of any object as an array of unsigned char

我注意到这包括void类型。我们不应该能够将任何东西投射到 void 并返回吗?

void 是一个不完整的类型。永远不可能有 void.

类型的对象

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

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

int i = 0;
(void)i;

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

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

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