gpt4 book ai didi

C++ 首先发生什么——破坏函数的参数或处理函数的返回值?

转载 作者:搜寻专家 更新时间:2023-10-31 00:15:24 24 4
gpt4 key购买 nike

我有以下代码:

class thing {
public:
thing(const thing& x) { cout << "copy" << endl; }
thing() { cout << "create" << endl; }
~thing() { cout << "destroy" << endl; }

thing& operator=(const int& rhs) { cout << "assign" << endl; }
};

int foo(thing x) {
return 5;
}

int main() {
thing bar;
thing newThing;
newThing = foo(bar);

getchar();
}

当我运行它时,在我的程序到达 getchar() 时,我希望看到以下输出:

create // since bar is default constructed
create // since newThing is default constructed
copy // since bar gets passed by value into foo
destroy // since foo's local thing `x` is destructed when foo ends
assign // since the 5 returned by foo is assigned to newThing

相反,我得到了这个:

create
create
copy
assign
destroy

请注意,assign 和 destroy 与我预期的有所不同。

这是怎么回事?为什么赋值似乎发生在 局部 x 被破坏之前?请注意,如果我在 foo 的主体中声明一个本地 thing,它会在分配发生之前被破坏,正如我所期望的那样。

最佳答案

有了这个签名:

int foo(thing x) {
return 5;
}

您正在创建一个函数,其中 thing 的实例是一个参数。参数由方法的调用者传入,也就是说这里的表达式:

newThing = foo(bar);

创建一个 thing 的临时对象,它是从 bar 复制的。这些临时对象的生命周期到完整表达式结束为止,因此该临时对象的析构函数在分配发生后被调用。

为什么会这样?因为编译器只生成一个名为 foo 的函数,而这个函数不能在本地构造 x - 它不知道用哪些参数来构造它。可能有多个有效的构造函数和几组不同的参数。因此,编译器必须在调用的调用方构建临时对象。

关于C++ 首先发生什么——破坏函数的参数或处理函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19526776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com