C++的void类型并非无人居住.问题在于,虽然它只有一个居民,非常像ML类语言中的Unit类型(又名()),居民不能被命名或传递为普通价值.例如,以下代码无法编译:
void foo(void a) { return; }
void bar() { foo(foo()); }
Run Code Online (Sandbox Code Playgroud)
而等效的(比方说)Rust代码编译得很好:
fn foo(a : ()) { return; }
fn bar() { foo(foo(())); }
Run Code Online (Sandbox Code Playgroud)
实际上,void就像一种unit类型,但只是半心半意.为什么会这样?
C++标准是否明确声明无法创建类型的值void?如果是,这个决定背后的理由是什么?如果没有,为什么上面的代码不能编译?
如果是一些向后兼容性相关的原因,请举一个代码示例.
要清楚,我不是在寻找解决问题的方法(例如使用空结构/类).我想知道现状背后的历史原因.
编辑:我稍微改变了代码示例中的语法,以明确我没有试图劫持现有的语法void foo(void)(因此,一些注释可能已过时).这个问题背后的主要动机是"为什么类型系统不像X",而不是 "为什么这一部分语法不像我喜欢的那样".如果你正在写一个关于打破向后兼容性的答案,请记住这一点.
"C++标准是否明确声明无法创建void类型的值?"
是.它声明这void是一种不完整的类型,无法完成.您无法创建具有不完整类型的对象或值.
这是一个古老的规则; 正如评论所指出的,它是从C继承而来的.C++中有一些小的扩展来简化通用代码的编写,例如void f(); void g() { return f(); }是合法的.
改变现状似乎没什么好处.C++不是一种学术语言.纯洁不是目标.编写有用的程序是,但这样的提案如何帮助?引用Raymond Chen的话,每个提案都从-100开始,并且必须证明其添加是合理的; 你没有证明缺乏功能.