C++ 中的无限 for 循环

Ken*_* Za 3 c++ for-loop

我正在玩一点 for 循环,尝试了以下代码并得到了无限循环。

#include<iostream>

int main(){
       int i {0};
       bool condition = i < 5;
       for ( ; condition ; ){
              std::cout << "Hello World!" << std::endl;
              i++;  
       }
}  
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么吗?

Ext*_*t3h 9

bool condition = i < 5;
Run Code Online (Sandbox Code Playgroud)

该行定义了一个名为 的变量,该变量具有从该行开始的condition值。true

它不会从右侧绑定表达式,而仅复制赋值时的结果。

你的意图更复杂:

auto condition = [&i](){ return i < 5; };
for ( ; condition() ; )
Run Code Online (Sandbox Code Playgroud)

Nowcondition是一个可以重复求值的函数对象。

赋值的右手称为 lambda 表达式,并遵循 的形式[capture scope](parameters){ body with return statement }

在捕获范围中,您可以按值(不带&)列出变量,在这种情况下,在声明 lambda 时它们会被复制一次;或者通过引用(带有前导&)列出变量,在这种情况下,它们不会被复制,而是复制 lambda 内的变量是对 lambda 外部同名变量的引用。还有一种简短形式[&],它通过引用捕获父作用域中的所有变量,并[=]通过值捕获所有内容。

auto为了简洁起见,可以在组合声明+赋值中使用,并自动从右侧解析变量的类型。

您可以显式指定的最接近的兼容类型是std::function<bool(void)>(具有该签名的函数的通用容器),该对象的实际类型是表示裸露 lambda 的某种内部类型,您无法显式编写它。因此,如果您无法知道确切的类型,并且您不想使用通用容器类型,auto有时甚至是必要的。