为什么void void在C++中取无效值?

Jef*_*ges 5 c++ optimization templates types

我很好奇为什么C++没有定义void via:

typedef struct { } void;
Run Code Online (Sandbox Code Playgroud)

即无法实例化的类型中的值是什么,即使该安装必须不生成代码?

如果我们使用gcc -O3 -S,那么以下两个产生相同的汇编程序:

int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

template <class T> T f(T a) { }
typedef struct { } moo;
int main() { moo a; f(a); return 0; }
Run Code Online (Sandbox Code Playgroud)

这很有道理.A struct { }只需要一个空值,很容易优化.事实上,奇怪的是,他们生成不同的代码-O3.

然而,你不能仅仅typedef void moo因为虚空无法承担任何价值,甚至不是空的价值.这种区别有没有用处?

还有其他各种强类型语言,比如Haskell,可能是MLs,它们的void类型有一个值,但是没有公开提供任何无价值的类型,尽管有些类型具有本机指针类型void *.

bit*_*ask 4

void我认为无法实例化的原因来自于 C++ 的 C 根源。在过去的血淋淋的日子里,类型安全并不是什么大事,void*s 不断地被传递。然而,您可能总是会看到那些并非字面意思的代码void*(由于typedefs、宏和 C++ 中的模板),但仍然意味着它。

void*如果您无法取消引用 a但必须首先将其转换为指向正确类型的指针,那么这是一点点安全性。无论您是通过使用Ben Voigt建议的不完整类型来实现这一点,还是使用内置void类型,都没有关系。防止您错误猜测您正在处理的类型,而实际上您不是。

是的,void引入了烦人的特殊情况,尤其是在设计模板时。但编译器不会默默地接受实例化尝试是一件好事(即有意为之)void