在'for'语句的第二个"参数"中声明的对象的生命周期

Jar*_*k C 7 c++ destructor for-loop

我刚刚发现可以在for语句的第二个"参数"中放置一个声明.但是我无法找到它在该参数中声明的对象的构造/销毁方面的行为方式.

我们有这个简单的代码:

struct C {
  C() { puts("constr"); }
  ~C() { puts("destr"); }
};

int main() {
  for (int i = 0; auto h = std::make_unique<C>(); i++) {
    puts("in");
  }
}
Run Code Online (Sandbox Code Playgroud)

请你告诉我什么时候h被销毁?(之后puts("in"),i++......?).它是如何与表现break;continue;

谢谢你的澄清!

lub*_*bgr 5

在循环条件中创建的对象的生命周期绑定到循环体的范围,也可以在迭代表达式中使用(i++在您的示例中).在每次迭代开始时评估条件,它创建的对象持续到该迭代结束,然后销毁并再次为下一次迭代创建,依此类推.breakcontinue语句不影响条件中创建的对象的生命周期.

推理如下.从[stmt.for],我们可以看到for循环是根据while循环定义的.

for语句

for ( init-statement condition ; expression ) statement
Run Code Online (Sandbox Code Playgroud)

相当于

{
    init-statement
    while ( condition ) {
        statement
        expression ;
    }
}
Run Code Online (Sandbox Code Playgroud)

跳回[stmt.while]然后得出你的问题的答案(强调我的):

当while语句的条件是声明时,声明的变量的范围从声明点([basic.scope.pdecl])延伸到while语句的末尾.while语句的条件是某个变量t的初始化声明等同于

label:
{ // start of condition scope
    condition; // declares t
    if (t) {
        statement
        goto label;
    }
} // end of condition scope
Run Code Online (Sandbox Code Playgroud)

[注意:在条件中创建的变量将被销毁,并在循环的每次迭代中创建.[...]