假设我有以下代码:
int bar = 0;
struct Foo {
~Foo() { bar = 1; }
};
int main(int argc, char ** argv) {
Foo f;
return bar;
}
计划的回报价值是多少? 0还是1?
答案 0 :(得分:12)
来自[stmt.return] / 3:
返回实体的复制初始化在由return语句的操作数建立的完整表达式结束时临时销毁之前进行排序,然后依次对其进行排序 包含return语句的块的局部变量(6.6)的破坏。
因此析构函数在初始化返回值后运行,并且在函数的第一次调用时返回值为0。
答案 1 :(得分:2)
自动变量的删除顺序与它们的声明相反。
因此,在调用~Foo()
之前建立函数的返回值。
foobar
的返回因此是一个非常明确的0。
如果您的函数返回int&
,那么您的问题会更有趣。