繁体   English   中英

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

[英]Life-time of object declared in the second “parameter” of 'for' statement

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

我们有这个简单的代码:

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

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

能不能请您告诉我,当h被破坏? (在puts("in")i++ ,......?)。 它如何与break;表现break; continue;

谢谢你的澄清!

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

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

for语句

 for ( init-statement condition ; expression ) statement 

相当于

 { init-statement while ( condition ) { statement expression ; } } 

跳回[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 

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

想一想,如果我是语言设计师,请注意以下几点:

for ( a; b; c ) d

for ( a; { b }; { c }) { d }

应该严格等同

很明显, a定义的一些变量可以用在bcd ,所以只有a是特殊的。

BTW

我认为Scala中的for语句更漂亮。 在Scala for只是一种语法:

for (i <- v) s  <==> v.foreach(i => s)

哪里

i => s

lamba语法是这样的:

[](auto i){ s }

在C ++ 11中

它是通用的,每个类型的变量v定义函数foreach可以用于for语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM