이 코드로 :
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
블록 읽기 -1
로 int&
? 상수가 아닌 lvalue 참조에 값을 할당 할 수 없습니다.
그리고 왜 std::cout
첫 번째 std::cerr
진술 전에 두 번째 진술이 실행 됩니까?
답변
이것은 [제외] / 3 때문에 괜찮습니다
예외를 던지면 예외 개체라는 임시 개체 ([dcl.init], [class.copy.ctor])가 초기화됩니다. 임시를 나타내는 lvalue는 일치하는 핸들러 ([except.handle])에 선언 된 변수를 초기화하는 데 사용됩니다 .
강조 광산
보시다시피, 임시이지만 컴파일러는 처리기를 초기화하기 위해 lvalue로 처리합니다. 이 때문에 const 참조가 필요하지 않습니다.
답변
에서 이 throw
참조 :
다른 임시 객체와 달리 예외 객체는 catch 절 매개 변수를 초기화 할 때 lvalue 인수로 간주되므로 lvalue 참조, 수정 및 다시 throw에 의해 포착 될 수 있습니다.
따라서 “객체”는 일시적이지만 여전히 lvalue이므로 참조 할 수 있습니다.