gpt4 book ai didi

c++ - 为什么没有将 yield 添加到 C++0x 中?

转载 作者:IT老高 更新时间:2023-10-28 12:43:04 25 4
gpt4 key购买 nike

编辑,在我问这个问题 11 年后:我觉得问这个问题是正确的! C++20 finally did something close enough .

原始问题如下。

--

我在我的许多 Python 程序中都使用了 yield,它真的在很多情况下都可以清理代码。我 blogged about it它是我网站的热门网页之一。

C#还提供yield——它是通过调用方的状态保持来实现的,通过一个自动生成的类来保持状态、函数的局部变量等来完成。

我目前正在阅读有关 C++0x 及其添加的内容;在阅读 C++0x 中 lambdas 的实现时,我发现它也是通过自动生成的类完成的,配备了 operator() 存储 lambda 代码。我的脑海中自然形成了一个问题:他们是为 lambdas 做的,为什么他们不考虑支持“yield”呢?

他们当然可以看到协同程序的值(value)......所以我只能猜测他们认为基于宏的实现(例如 Simon Tatham's )是一个足够的替代品。然而,它们不是,有很多原因:被调用者保持状态、不可重入、基于宏(仅此一点就足够了)等等。

编辑: yield 不依赖于垃圾收集、线程或纤程。大家可以看一下Simon的文章就知道我说的是编译器做一个简单的转换,比如:

int fibonacci() {
int a = 0, b = 1;
while (true) {
yield a;
int c = a + b;
a = b;
b = c;
}
}

进入:

struct GeneratedFibonacci {
int state;
int a, b;

GeneratedFibonacci() : state (0), a (0), b (1) {}

int operator()() {
switch (state) {
case 0:
state = 1;
while (true) {
return a;

case 1:
int c = a + b;
a = b;
b = c;
}
}
}
}

垃圾收集?不,线程?不,纤维?不,简单的转变?可以说是的。

最佳答案

我不能说他们为什么不添加这样的东西,但在 lambdas 的情况下,它们也不是只是添加到语言中的。

他们以 Boost 中的库实现开始生活,这证明了

  • lambdas 非常有用:很多人会在可用时使用它们,而且
  • C++03 中的库实现存在许多缺点。

基于此,委员会决定在 C++0x 中采用某种 lambda,我相信他们最初尝试添加更通用的语言特性以允许 更好 em> 库实现比 Boost 有。

最终,他们将其作为核心语言特性,因为他们别无选择:因为不可能做出一个足够好的库实现。

新的核心语言功能不仅仅是因为它们看起来是个好主意而简单地添加到语言中。委员会非常不愿意添加它们,而有问题的功能真的需要证明自己。必须表明该特征是:

  • 可以在编译器中实现,
  • 要解决真正的需求,并且
  • 库实现还不够好。

如果有yield关键字,我们知道第一点可以解决。正如您所展示的,这是一个相当简单的转换,可以机械地完成。

第二点很棘手。这有多少需要?现有的库实现的使用范围有多广?有多少人为此提出过要求,或为此提交过提案?

最后一点似乎也过去了。正如您所指出的,至少在 C++03 中,库实现存在一些缺陷,这可以证明核心语言实现的合理性。可以在 C++0x 中实现更好的库吗?

所以我怀疑主要问题实际上是缺乏兴趣。 C++ 已经是一门庞大的语言,除非添加的功能真的值得,否则没有人希望它变得更大。我怀疑这还不够用。

关于c++ - 为什么没有将 yield 添加到 C++0x 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3864410/

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