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;?
谢谢你的澄清!
在循环条件中创建的对象的生命周期绑定到循环体的范围,也可以在迭代表达式中使用(i++在您的示例中).在每次迭代开始时评估条件,它创建的对象持续到该迭代结束,然后销毁并再次为下一次迭代创建,依此类推.break或continue语句不影响条件中创建的对象的生命周期.
推理如下.从[stmt.for],我们可以看到for循环是根据while循环定义的.
for语句
Run Code Online (Sandbox Code Playgroud)for ( init-statement condition ; expression ) statement相当于
Run Code Online (Sandbox Code Playgroud){ init-statement while ( condition ) { statement expression ; } }
跳回[stmt.while]然后得出你的问题的答案(强调我的):
当while语句的条件是声明时,声明的变量的范围从声明点([basic.scope.pdecl])延伸到while语句的末尾.while语句的条件是某个变量t的初始化声明等同于
Run Code Online (Sandbox Code Playgroud)label: { // start of condition scope condition; // declares t if (t) { statement goto label; } } // end of condition scope[注意:在条件中创建的变量将被销毁,并在循环的每次迭代中创建.[...]
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |