C++20 改进了 for 循环语法
摘要
C++20 引入了基于范围的 for 循环的新语法,允许在循环作用域内声明初始化器,达到了与 Python 和 Lua 等语言一样的便利性。
暂无内容
查看缓存全文
缓存时间: 2026/07/15 01:38
# Lzon.ca. 一个程序员和IT专家的个人博客。来源:https://lzon.ca/posts/tips/cpp-for-range-init/ C++20 带来的一小段语法糖。--- 假设我想打印以下内容:`` 1: the 2: quick 3: brown 4: fox 5: jumped 6: over 7: the 8: lazy 9: dog `` 如果用 Python,我会写类似这样的代码:`` vec = [ "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" ] for i, it in enumerate(vec, start=1): print(f"{i}: {it}") `` 如果用 Lua,它可能会是这样:`` local vec = { "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" } for i, it in ipairs(vec) do print(i .. ": " .. it) end `` 但如果我用 C++17 或更早版本,等效的做法会是这样的:`` vector vec = { "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" }; for (int i = 0; i < vec.size(); ++i) { auto&& it = vec[i]; cout << i << ": " << it << endl; } `` 这些例子的共同点是都产生了一个 for 循环,其作用域中同时包含索引值和元素引用。C++ 比较特别,需要额外引入一条语句来引入引用到循环作用域。在 C++20 中,现在可以写出与其他语言匹配的例子了,它看起来像这样:`` vector vec = { "the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" }; for (int i=0; auto&& it: vec) cout << (++i) << ": " << it << endl; `` 实现这一特性的具体提案叫做带初始化器的基于范围的 for 语句 (https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0614r0.html),它非常类似于 C++17 的一个早期提案——带初始化器的 if 语句 (https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r0.html)。我在本文中展示的正是这个语言特性的预期使用场景。我非常喜欢它。虽然看起来很小,但这种小语法糖如果放在整个代码库中使用,会产生很大的收益。我也是刚刚发现它,但今后我打算专门使用它,而不是传统的方式。--- 在我看来,C++ 标准委员会在维护语言方面做得不错,并在适当的时候引入有用的特性。你是否也发现了像这样提升生活质量的小功能?如果有,请告诉我!发送邮件到[[email protected]](mailto:[email protected]),或者在我的主页 (https://lzon.ca/) 上的某个社交账号私信我。
相似文章
@vivekgalatage: 迟到总比不到好。我知道C++26已经全面推出,但许多功能的基础版本源自……
所有C++20核心语言功能的详细概述及示例,作为速查表。
C++26 中 std::format 的改进
C++26 标准对 std::format 库进行了多项改进,包括直接指针格式化、路径格式化、constexpr 支持,以及为 std::println 新增的空行重载。
C++26:更多函数包装器
C++26 引入了两个新的函数包装器:std::copyable_function(提供了可复制且 const 正确的 std::function 替代品)和 std::function_ref(一个非拥有、可调用的引用,具有引用语义)。
C语言中在C++中仍然无法工作的构造——以及一些已发生变化的构造
一篇更新经典调查的博文,关于C语言中在C++中无法工作的构造,涵盖了C++20和C23标准中影响兼容性的变化。
Enhancements in Dyalog v20.0: Arrays, Namespaces, Composition, Inline Tracing - Asher Harvey-Smith
Dyalog v20.0 引入了数组符号、内联跟踪器和 behind 组合运算符,显著提升了 APL 编码体验和调试效率。