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

标签 c++ templates optimization types

我很好奇为什么 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/

相关文章:

c++ - 如何强制库在qt creator中静态链接

python - 无需 for 循环即可对数组元素进行运算

c - LoadLibrary 调用,返回的指针未保存

c++ - 使用 Swift 或 Objective-C 创建 Dylib 文件

c++ - 配置 netbeans 8.0 gdb 以使用 gradle cpp 插件

c++ - 为什么模板参数推导不起作用?

C++ 模板及其元素类型

c++ - 模板子类的重载运算符==问题

算法题: flipping columns

c++ - 创建一个 2 行(不换行)的 QPushButton