이 코드로 :
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
진술 전에 두 번째 진술이 실행 됩니까?
@Scheff, 죄송합니다. 첫 번째 출력이로 리디렉션
—
Ghasem Ramezani
error stream
되지 않습니다 standard stream
.
@ FrançoisAndrieux 그것이 허용되는 이유는 다른 의미가 진행되고 있기 때문입니다. 일반적으로 임시로 당신은 무슨 일이 일어날 지 알지 못하므로 임시 참조에 대한 const 참조 만 허용하기로 결정했습니다. 예외적으로, 우리는 객체의 수명을 알고 있으며 객체를 수정하고 더 높은 컨텍스트로 다시 던지기를 원할 수 있습니다. 이를 용이하게하기 위해 표준은 상수가 아닌 lvalue 참조에 대한 바인딩을 허용합니다.
—
NathanOliver
@ FrançoisAndrieux
—
HolyBlackCat
throw
는 전달한 객체를 복사하거나 이동시킵니다. 참조는 해당 복사본에 바인딩됩니다. 사본이 lvalue라는 것이 합리적입니다.
We caught an int exception with value: -1
라인 먼저 인쇄한다.