int를 던지고 잡는 것은 어떻게 작동합니까? an int exception

이 코드로 :

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}

우리는 :

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1

: 방법을 않는 catch블록 읽기 -1int&? 상수가 아닌 lvalue 참조에 값을 할당 할 수 없습니다.

그리고 왜 std::cout첫 번째 std::cerr진술 전에 두 번째 진술이 실행 됩니까?



답변

이것은 [제외] / 3 때문에 괜찮습니다

예외를 던지면 예외 개체라는 임시 개체 ([dcl.init], [class.copy.ctor])가 초기화됩니다. 임시를 나타내는 lvalue는 일치하는 핸들러 ([except.handle])에 선언 된 변수를 초기화하는 데 사용됩니다 .

강조 광산

보시다시피, 임시이지만 컴파일러는 처리기를 초기화하기 위해 lvalue로 처리합니다. 이 때문에 const 참조가 필요하지 않습니다.


답변

에서 throw참조 :

다른 임시 객체와 달리 예외 객체는 catch 절 매개 변수를 초기화 할 때 lvalue 인수로 간주되므로 lvalue 참조, 수정 및 다시 throw에 의해 포착 될 수 있습니다.

따라서 “객체”는 일시적이지만 여전히 lvalue이므로 참조 할 수 있습니다.