gpt4 book ai didi

c++ - 在 C++ 中 throw e for refer 时局部 var destroy?

转载 作者:行者123 更新时间:2023-11-30 02:51:53 25 4
gpt4 key购买 nike

代码示例一:

try {
exception e;
throw e;
} catch(exception& refer)

代码示例二:

exception& method()
{
exception e;
return e;
}

有些书上提到代码示例一是可以的,代码二是错误的,因为 e 是一个局部变量,函数结束时会销毁,但我的问题是为什么示例代码一好的? e 不也是局部变量吗?

最佳答案

是的,在示例 1 中,e 在 try block 中是本地的,并且在退出该范围时被销毁。但是当你抛出时,编译器会制作一个拷贝(或移动),谁的生命周期会延长到 catch block 的末尾,而引用 refer 所指的就是这个拷贝。

为了弄清楚编译器在这种情况下会做什么,我总是喜欢提取我的 Noisy 类。

#include <iostream>

class Noisy
{
public:
Noisy()
{ std::cout << "Noisy default construct\n"; }
Noisy(Noisy const&)
{ std::cout << "Noisy copy\n"; }
Noisy(Noisy&&)
{ std::cout << "Noisy move\n"; }
~Noisy()
{ std::cout << "Noisy destroy\n"; }
Noisy& operator=(Noisy const&)
{ std::cout << "Noisy copy assign\n"; return *this; }
Noisy& operator=(Noisy&&)
{ std::cout << "Noisy move assign\n"; return *this; }
void swap(Noisy&)
{ std::cout << "Noisy swap\n"; }
};

int main(int argc, char* argv[])
{
try
{
std::cout << "in try block\n";
Noisy n;
std::cout << "about to throw n\n";
throw n;
std::cout << "end of try block\n";
}
catch (Noisy & n)
{
std::cout << "in catch block\n";
}
std::cout << "after catch\n";
}

关于c++ - 在 C++ 中 throw e for refer 时局部 var destroy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19393492/

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