[英]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++
)。 在每次迭代开始时评估条件,它创建的对象持续到该迭代结束,然后销毁并再次为下一次迭代创建,依此类推。 break
或continue
语句不会影响在条件中创建的对象的生命周期。
推理如下。 从[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
定义的一些变量可以用在b
, c
, d
,所以只有a
是特殊的。
我认为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.