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

标签 c++ reference

代码示例一:

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/

相关文章:

c++ - C++ 中的类和构造函数

c++ - 如何防止对迭代器实例的悬挂引用

java - 我可以测试是否存在对 java 中对象的另一个引用吗?

java - 在 Java 的另一个类中实例化/初始化的对象的引用变量

rust - 关于引用的可变性和引用所指值的可变性的一些混淆

c++ - 在 C++ 中使用引用和指针的原因和位置

c++ - 如何从一维数组中提取子图像?

c++ - 为什么 strtok 不能与 stringstream 一起使用?

c++ - 通用观察者模式

pointers - Go 中指向结构或数组值的指针如何工作?