gpt4 book ai didi

c++ - 为什么 void 在 C++ 中不采用 void 值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:18 25 4
gpt4 key购买 nike

我很好奇为什么 C++ 不通过 :

定义 void
typedef 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com