yield”关键字在VS2017中被“co_yield”替换

原文发表地址] `yield` keyword to become `co_yield` in VS 2017

[原文作者] EricMittelette

[原文发表时间] 2017/1/27

协程(Coroutines)---也就是之前我们说的”C++ resumable方法重入函数”---它作为技术规范TS的一部分已经在Visual C++编译器上实现.自2013年11月VC++ CTP release版本发布支持协程功能,已经有三年的时间.

如果你正在使用协程,你应该发现关键字’yield’在VS2017中被移除.如果你的代码里面含有’yield’关键字, 你需要将它们替换为’co_yield’.如果生成器使用了’yield 表达式’,这些也需要替换为’co_yield 表达式’.

如果想将’await’替换为’co_await’, 协程中的‘return’替换为’co_return’.新的Visual C++编译器也会接受这样的改变.

请参考协程技术规范: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf

如果有什么问题,你也可以给我们发邮件或者在评论下面留言.

为什么这样改变

作为技术规格,协程还没有被C++标准采纳.Visual C++团队最初实现协程功能时,它还只是个有前景的C++特性.2015年10月,C++标准委员会投票引入前缀”co_”去替换关键字.委员会不想改变可能会引起冲突的正在使用的关键字.”yield”关键字已经被广泛使用在农业和财务相关的应用软件中.同时,thread support library线程支持库中的Ranges TS

关键字替换如下图

 

Instead of `await` Use `co_await`
Instead of `return` Use `co_return`
Instead of `yield` Use `co_yield`

我们在VS2017中移除了”yield”关键字是因为Range-V3特性的实现, 我们希望许多开发人员声明了ranges(using namespace ::ranges)后去调用”yield”.

 

防止关键字的改变可能出现的破坏

许多人的代码中会依赖协同功能,关键字的改变带来的破坏性改变可能会带来一些困难.但是我们没有办法阻止C++委员会对关键字的改变。至少我们努力让你对这样的改变并不会感到意外.

我们在VS2015 Update1中实现Modules TS特性时创建了一个新的编译选项,/experimental.你需要在命令行中包含’/experimental:module’,这样清楚的知道这是可能会改变的C++体验特性.你也知道三年前我们使用’/experimental:await’来替换/await(也包括/experimental:coroutine).

为了支持新的关键字”co_await”和”cp_return”, 我们会在以后发布的办法中丢弃”await”关键字, 协程中使用return的限制.

结语

和往常一样,关于协程,请提供您的反馈到visualcpp@microsoft.com.

如果遇到其他关于VS2017 Visual C++的问题, 请通过Report a Problem选项告诉我们,也可以通过安装界面.对于建议,请通过UserVoice告诉我们。 谢谢!