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
在任何上下文中都是不完整类型,您不能取消引用指向不完整类型的指针。
我仔细阅读了类型别名的规则:http://en.cppreference.com/w/cpp/language/reinterpret_cast#Type_aliasing我对最后一条规则特别有疑问,其中我们可以转换为:
char
orunsigned char
: this permits examination of the object representation of any object as an array ofunsigned char
我注意到这不包括void
类型。我们不应该能够将任何东西投射到 void
并返回吗?
void
是一个不完整的类型。永远不可能有 void
.
void
很奇怪,因为你可以声明一些东西 void*
,但你很少会在函数定义的上下文之外单独使用 void
。从这个意义上说,它是一个不完整的类型,因此本身没有真正的意义。 void
真的只是为了语法而存在。
从技术上讲,您可以将类型转换为 void
、
int i = 0;
(void)i;
但这真的是一个空操作。当有人试图隐藏有关未使用变量的编译器警告时,您可能会看到这一点。您无法将结果转换回其原始类型,因为它不会产生结果。
您还可以将指针强制转换并声明为 void*
,这意味着它可以指向任何东西(有一些例外)。但是,在将其转换为完整类型之前,您不能取消引用它,例如 unsigned char
.
在这种情况下没有类型别名,因为您无法通过 void*
检查对象。为此,您必须取消引用 void*
,但这是不允许的。 void
在任何上下文中都是不完整类型,您不能取消引用指向不完整类型的指针。