为什么析构函数不会修改返回的变量

use*_*696 2 c++

以下代码使用修改的析构函数i.当析构函数运行时,2应该存储到我们观察到的返回i时.thing()-1

#include <stdio.h>

class Destruct {
    int &i;
public:
    Destruct(int &_i) : i(_i) {}
    ~Destruct() {
        i = 2;
    }
};

int thing() {
    int i = -1;
    Destruct d(i);
    return i;
}

int main() {
    printf("i: %d\n", thing());
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 12

int thing() {
    int i = -1;
    Destruct d(i);
    return i;
}
Run Code Online (Sandbox Code Playgroud)

d函数返回时对象被破坏,堆栈清理开始!到调用析构函数时,返回的值已经复制到返回寄存器.

通过这样做可以看出你想看到的东西:

int thing() {
    int i = -1;
    {
        Destruct d(i);  //put it inside braces!
    }
    return i;
}
Run Code Online (Sandbox Code Playgroud)

来自你的评论:

这就是它的工作原理,代码的反汇编表明情况就是这样.我很好奇为什么.

逻辑是直截了当的,它可以用这种方式证明:假设析构函数在i被复制到返回寄存器之前被调用,那么为什么选择性地销毁d而不是i呢?毕竟两者都是局部变量.如果d被破坏,那么在将其值复制到返回寄存器之前i也应该被破坏,但这没有意义.

正如@Luc Touraille(在评论中)所说的那样:"如果你的功能恢复了d怎么办?你确定你想被传递给来电者之前d破坏吗?"

  • @ user1290696:因为在return语句之前破坏对象是没有意义的:如果你的函数返回`d`怎么办?你确定在传递给来电者之前你想要"d"被破坏吗? (3认同)