C++20 改进了 for 循环语法

Hacker News Top 新闻

摘要

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/) 上的某个社交账号私信我。

相似文章

C++26 中 std::format 的改进

Lobsters Hottest

C++26 标准对 std::format 库进行了多项改进,包括直接指针格式化、路径格式化、constexpr 支持,以及为 std::println 新增的空行重载。

C++26:更多函数包装器

Lobsters Hottest

C++26 引入了两个新的函数包装器:std::copyable_function(提供了可复制且 const 正确的 std::function 替代品)和 std::function_ref(一个非拥有、可调用的引用,具有引用语义)。