我很好奇为什么 C++ 不通过 :
定义 voidtypedef struct { } void;
即无法实例化的类型的值是什么,即使该安装必须不产生代码?
如果我们使用 gcc -O3 -S
,那么以下两个都会产生相同的汇编程序:
int main() { return 0; }
和
template <class T> T f(T a) { }
typedef struct { } moo;
int main() { moo a; f(a); return 0; }
这很有道理。 struct { }
只需要一个空值,很容易优化掉。事实上,奇怪的是它们在没有-O3
的情况下生成不同的代码。
但是,您不能简单地使用 typedef void moo
来实现同样的技巧,因为 void 不能假定任何值,甚至不能是空值。这种区分有什么用处吗?
还有许多其他强类型语言,如 Haskell,大概还有 ML,它们的 void 类型有一个值,但公开地不提供无值类型,尽管有些拥有 native 指针类型,其行为类似于 void *
.
最佳答案
我看到 void
无法实例化的基本原理来自 C++ 的 C 根。在血淋淋的过去,类型安全并不是什么大问题,void*
不断被传递。但是,您可能总是在查看没有字面意思的 void*
的代码(由于 typedef
、宏和 C++ 中的模板),但仍然是它的意思。
如果您不能解除对 void*
的引用,但必须首先将其转换为指向正确类型的指针,那么这有点安全。您是否通过使用不完整的类型来完成此操作 Ben Voigt建议,或者如果您使用内置的 void
类型都没有关系。您可以避免错误地猜测您正在处理一个类型,而实际上您不是。
是的,void
引入了烦人的特殊情况,尤其是在设计模板时。但编译器不会默默地接受实例化 void
的尝试是一件好事(即有意)。
关于c++ - 为什么 void 在 C++ 中不采用 void 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9969517/