在下面的代码中:
#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的?我无法理解
答案 0 :(得分:2)
自动变量以声明的相反顺序销毁,因此指示的析构函数是s1
的析构函数。
在程序中该点采用值{"", 42}
的原因是f
的返回值正在由移动构造初始化;也就是说,s1
被视为xvalue。这来自 [class.copy] / 32:
当满足或将满足复制操作的省略标准时,除了源的事实 object是一个函数参数,要复制的对象由左值,重载决策指定 首先执行选择复制的构造函数,就像对象是由右值指定一样。