문제

다음 코드를 고려해보세요.

#include <iostream>
#include <stdexcept>

void foo()
{
    throw std::runtime_error("How long do I live?");
}

int main()
{
    try
    {
        foo();
    }
    catch (std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}

참조로 예외를 잡을 수 있는 이유는 무엇입니까? std::runtime_error("How long do I live?") rvalue?

왜 예외 개체가 catch 블록에 아직 살아 있나요?

던져진 예외 객체는 정확히 어디에 저장되나요?그들의 수명은 얼마나 됩니까?

올바른 솔루션이 없습니다

다른 팁

C++ 표준의 단락 15.1.4:

던져진 예외의 임시 사본에 대한 기억은 3.7.3.1에 언급 된 경우를 제외하고 지정되지 않은 방식으로 할당됩니다. 예외를 위해 핸들러가 실행되는 한 임시는 지속됩니다..특히, 핸들러가 던지기를 실행하여 종료하는 경우;문서, 동일한 예외를 위해 다른 핸들러에게 제어를 전달하므로 임시가 남아 있습니다.예외에 대해 실행되는 마지막 핸들러가 던지기 외에 다른 수단으로 종료 될 때;임시 객체가 파괴되고 구현은 임시 객체에 대한 메모리를 처리 할 수 ​​있습니다.그러한 거래는 지정되지 않은 방식으로 수행됩니다.파괴는 핸들러의 예외 폐지에서 선언 된 대상의 파괴 직후에 발생합니다.

C++ 표준 대화에서 핸들러는 catch 올바른 인수 유형을 사용하여 차단하세요.

던진 예외는 임시가 아닙니다. 컴파일러 생성 예외 코드는 영구 사본을 보관합니다. 따라서이를 중단되지 않은 참조에 바인딩 할 수 있습니다.

편집] 표준을 확인하고 실제로 임시 사본을 나타냅니다. 그러나 임시 수명은 적어도 예외 핸들러의 수명만큼 길다는 보장됩니다.

Neil이 말했듯이, 내부 컴파일러 마법이 진행되고 있습니다. 또한 컴파일러가 생성 할 수 있습니다. 다수의 사본 예외 객체의.

언어의 세부 사항을 이해하려고 노력한 Kudos. 동시에, IMHO, 왜 당신이 왜 당신을 이해하는 것이 훨씬 더 중요합니다. ~해야 한다 왜 당신보다 참조로 예외를 포착하고 가치로 던지십시오. ~할 수 있다.

사람들은 일반적으로 예외 클래스의 계층 구조를 사용하고 참조로 잡기를 통해 개별 예외 유형을 개별적으로 처리 할 필요가없는 경우 다형성을 활용하고 기본 클래스를 제외하고 포착 할 수 있습니다. 참조로 잡을 수 없다면, 당신은 catch 가능한 모든 유형의 예외에 대한 조항 try 절.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top