这个是谁的析构函数?

时间:2014-11-04 11:05:28

标签: c++

在下面的代码中:

#include <string>
#include <iostream>

struct S {
    std::string a;
    int b;

    S(const S&) = default;
    S(S&&) = default;
    S& operator=(const S&) = default;
    S& operator=(S&&) = default; // not required here but should be added for completeness

    ~S() {
        std::cout << a << " " << b << std::endl;
    }
};

S f(S arg) {
    S s0{};
    S s1(s0); //s1 {s0}; in the book
    s1 = arg;
    return s1;
}

int main()
{
    S s3{"tool",42};
    f(s3);
}

我得到以下输出(我用我的推理评论了输出):

 42 //???
 0  // s0 is destroyed
tool 42 // arg is destroyed
tool 42 // return value of f() is destroyed
tool 42 // s3 is destroyed

其析构函数是输出42的?我无法理解

1 个答案:

答案 0 :(得分:2)

自动变量以声明的相反顺序销毁,因此指示的析构函数是s1的析构函数。

在程序中该点采用值{"", 42}的原因是f的返回值正在由移动构造初始化;也就是说,s1被视为xvalue。这来自 [class.copy] / 32:

中的规则
  

当满足或将满足复制操作的省略标准时,除了源的事实   object是一个函数参数,要复制的对象由左值,重载决策指定   首先执行选择复制的构造函数,就像对象是由右值指定一样。