何时复制返回值

时间:2016-02-03 12:51:22

标签: c++ c++11 visual-c++

假设我有以下代码:

int bar = 0;

struct Foo {
    ~Foo() { bar = 1; }
};

int main(int argc, char ** argv) {
    Foo f;
    return bar;
}

计划的回报价值是多少? 0还是1?

2 个答案:

答案 0 :(得分:12)

来自[stmt.return] / 3:

  

返回实体的复制初始化在由return语句的操作数建立的完整表达式结束时临时销毁之前进行排序,然后依次对其进行排序   包含return语句的块的局部变量(6.6)的破坏。

因此析构函数在初始化返回值后运行,并且在函数的第一次调用时返回值为0。

答案 1 :(得分:2)

自动变量的删除顺序与它们的声明相反。

因此,在调用~Foo()之前建立函数的返回值。

foobar的返回因此是一个非常明确的0。

如果您的函数返回int&,那么您的问题会更有趣。