假设我有以下代码片段:
Foo foo;
....
return bar();
现在,C++ 标准是否保证 bar() 将在 foo::~Foo() 之前调用?或者这是编译器/实现的选择?
Thanks!
这是有保证的行为。实际执行过程如下:
0: enter block (scope)
1: Foo::Foo()
2. evaluation of bar(); as expression in return statement
3. save result of the expression as value returned from function
4. finalize return statement to leave function to its caller (request exit from current scope)
5: exit block (scope) with call to Foo::~Foo()
以下是该标准的一些参考:
1.9 程序执行
10 每个具有自动存储期限(3.7.2)的对象的实例是
与其每个条目相关联
堵塞。
3.7.2 自动存储时间
1 显式声明 auto 或注册或未显式声明的本地对象
static 或 extern 具有自动存储期限。存储为
这些对象将持续存在,直到创建它们的块退出为止。
6.6.3 返回语句
2 (...) 表达式的值返回给函数的调用者
and
6.6 跳转语句(return属于跳转语句)
2 从作用域退出时(无论如何完成),将为所有对象调用析构函数(12.4)
具有自动存储期限的构造对象(3.7.2)
6.7 声明声明
2 块中声明的具有自动存储期限的变量是
在退出区块时被销毁
and
12.4 析构函数
10 为构造函数隐式调用析构函数 (1)
具有静态存储持续时间的对象
(3.7.1) 程序终止时
(3.6.3), (2) 对于构造对象
具有自动存储期限
(3.7.2) 当块中
对象创建后退出 (6.7)
掌握分散在所有 C++ 标准中的单一想法形式的细节并不容易。希望快速概述也能帮助您自己进行此类分析。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)