我有这个代码: -
int i;
class A
{
public:
~A()
{
i = 10;
}
};
int& foo()
{
i = 3;
A ob;
return i;
}
int main()
{
cout << "i = " << foo() << endl; //call to foo
return 0;
}
我对在遇到return i语句后编译器执行此代码的顺序感到困惑。 我猜: 调用者(main)的变量(比如K)并且对它的引用被传递给foo(),当遇到return语句时,编译器将return语句的值复制到K中,在这种情况下是地址i,作为参考被退回。然后它跳转到foo()的末尾并调用类对象ob的析构函数,它将i的值更改为10.然后删除foo()及其所有变量(包括对K的引用传递给foo)来自调用堆栈并且控件返回到main,其中K将调用替换为foo()并且实现了cout。 这是编译器采取的正确操作顺序吗?
我广泛搜索了调用返回时内存中发生的情况,this是最好的结果,尽管它是针对C#的。