【发布时间】:2018-08-16 01:48:15
【问题描述】:
C++ 的void 类型并非无人居住。问题在于,虽然它只有一个居民,很像类似 ML 语言中的 Unit 类型(又名 ()),但该居民不能被命名或作为普通值传递。例如下面的代码编译失败:
void foo(void a) { return; }
void bar() { foo(foo()); }
而等效(比如说)Rust 代码可以编译得很好:
fn foo(a : ()) { return; }
fn bar() { foo(foo(())); }
实际上,void 类似于 unit 类型,但只是半心半意。为什么会这样?
C++ 标准是否明确声明不能创建void 类型的值?如果是,这个决定背后的理由是什么?如果不是,为什么上面的代码不能编译?
如果是向后兼容的原因,请给出代码示例。
需要明确的是,我不是在寻找解决问题的方法(例如,使用空的结构/类)。我想知道现状背后的历史原因。
编辑:我稍微更改了代码示例中的语法,以表明我没有试图劫持现有语法,如void foo(void)(因此,某些 cmets 可能已过时)。问题背后的主要动机是“为什么类型系统不像 X”和 not“为什么这部分语法不像我想要的那样表现”。如果您正在撰写有关破坏向后兼容性的答案,请记住这一点。
【问题讨论】:
-
有一个regular void 提案,您可能会觉得很有趣。 :)
-
历史原因是
void及其几乎所有属性都直接来自C。问C为什么不从ML中取一个特征是倒退的; C 比 ML 更老。所以我不确定你在问什么;为什么 C++ 没有从 C 的 void 中改变 void? -
std::monostate不会是 ML 模拟吗? (而不是解决方法。)或者您是否希望 C++ 更改void的语义,并破坏向后兼容性,并显着阻碍 C 互操作性。 (C 互操作性已经有一系列警告、陷阱和关注点。改变 void 的语义将是可怕的。) -
@theindigamer:另外,说“语句的类型是
void”是不正确的。表达式有类型,作为表达式的语句可能没有void类型,而不是表达式的语句根本没有类型。 -
@theindigamer:仅仅因为一位学者给你一个语言 (Xi) 的描述(在 lambda 演算中),其中语句具有类型,并不意味着它在 C++ 中是正确的。我在该 pdf 中没有看到任何关于 C++ 的声明。