在 C++20 中,范围 for 循环(range - based for loop)引入了一个新的特性:初始化语句(Init Statement)。这一特性允许在范围 for 循环中直接声明变量,其作用域仅限于循环内部,从而提高了代码的可读性和安全性。

C++20 范围 for 循环中的初始化语句

在 C++20 之前,范围 for 循环的语法是:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

for (item - declaration : range - initializer) {
    // loop body
}

C++20 扩展了这一语法,允许在循环开始前添加一个初始化语句:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

for (init - statement; item - declaration : range - initializer) {
    // loop body
}

其中,init - statement 可以是任何语句,例如变量声明或函数调用。

使用场景

1. 局部变量的作用域限制

在 C++20 之前,如果需要在范围 for 循环中使用额外的变量(如索引),通常需要在循环外部声明这些变量,这可能会导致变量的作用域超出必要范围。C++20 允许将这些变量的作用域限制在循环内部。

示例:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

#include <iostream>
#include <array>
#include <string>

int main() {
    std::array<std::string, 3> data = {"hello", ",", "world"};
    for (std::size_t i = 0; auto& d : data) {
        std::cout << i++ << ' ' << d << '\n';
    }
    return 0;
}

在这个例子中,变量 i 的作用域仅限于循环内部。当循环结束后,i 就会被销毁,不会占用额外的内存空间,也避免了在后续代码中意外使用 i 导致的错误。

2. 临时范围的安全迭代

C++20 的初始化语句还允许安全地迭代临时范围。例如,可以直接在循环中创建一个临时的容器对象,并对其进行迭代。

示例:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

#include <iostream>
#include <string>

int main() {
    for (std::string v = std::to_string(42); auto c : v) {
        std::cout << c << '\n';
    }
    return 0;
}

在这个例子中,v 是一个临时的 std::string 对象,其生命周期仅限于循环内部。当循环结束时,v 会自动被销毁,避免了内存泄漏的风险。

3. 解决潜在的未定义行为(UB)

在某些情况下,范围 for 循环可能会导致未定义行为,例如当迭代的对象是一个临时对象时。C++20 的初始化语句可以有效避免这类问题。

示例:

代码语言:cpp

代码运行次数:0

运行

AI代码解释

#include <iostream>
#include <vector>
#include <string>

class Foo {
public:
    const auto& items() const { return data; }
private:
    std::vector<const char*> data{"hello", ",", "world"};
};

Foo getFoo() { return Foo(); }

int main() {
    for (auto foo = getFoo(); auto& d : foo.items()) {
        std::cout << d << '\n';
    }
    return 0;
}

在这个例子中,getFoo() 返回一个临时对象,而 foo.items() 的生命周期与 foo 一致,因此不会导致未定义行为。如果没有使用初始化语句,直接对 getFoo().items() 进行迭代,可能会因为临时对象 getFoo() 提前销毁而导致未定义行为。

总结

C++20 的范围 for 循环中的初始化语句提供了一种更灵活、更安全的方式来声明和使用局部变量。它不仅限制了变量的作用域,还避免了潜在的未定义行为,同时提高了代码的可读性和安全性。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐