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


14

이 코드로 :

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진술 전에 두 번째 진술이 실행 됩니까?


2
이것이 정확한 결과인지 확신하십니까? We caught an int exception with value: -1라인 먼저 인쇄한다.
HolyBlackCat

1
@Scheff, 죄송합니다. 첫 번째 출력이로 리디렉션 error stream되지 않습니다 standard stream.
Ghasem Ramezani


2
@ FrançoisAndrieux 그것이 허용되는 이유는 다른 의미가 진행되고 있기 때문입니다. 일반적으로 임시로 당신은 무슨 일이 일어날 지 알지 못하므로 임시 참조에 대한 const 참조 만 허용하기로 결정했습니다. 예외적으로, 우리는 객체의 수명을 알고 있으며 객체를 수정하고 더 높은 컨텍스트로 다시 던지기를 원할 수 있습니다. 이를 용이하게하기 위해 표준은 상수가 아닌 lvalue 참조에 대한 바인딩을 허용합니다.
NathanOliver

1
@ FrançoisAndrieux throw는 전달한 객체를 복사하거나 이동시킵니다. 참조는 해당 복사본에 바인딩됩니다. 사본이 lvalue라는 것이 합리적입니다.
HolyBlackCat

답변:


10

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

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

강조 광산

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


1
그러나 메시지가 나타나는 순서는 어떻습니까?
Tomáš Zato-복원 모니카

8

에서 throw참조 :

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.