나는 약간 불편한 문제를 접하게되었습니다. C++에서는 객체가 던져지면 먼저 임시 객체에 복사되고 임시 객체는 catching 코드로 전달됩니다. 복사본에는 개체의 클래스 복사 생성자가 사용됩니다. AFAIK, 즉 클래스에 전용 복사 생성자가 있으면 예외로 사용할 수 없습니다. 그러나 VS2010에서 다음 코드가 컴파일되어 실행됩니다.개인용 사본 생성자가있는 객체를 던질 수 있습니까?
class Except
{
Except(const Except& other) { i = 2; }
public:
int i;
Except() : i(1) {}
};
int main()
{
try
{
Except ex1;
throw ex1; // private copy constructor is invoked
}
catch (Except& ex2)
{
assert(ex2.i == 2); // assert doesn't yell - ex2.i is indeed 2
}
return 0;
}
이 방법이 적합합니까?
시도를 생략하더라도 호출 순서를 보면 어쩌면 상황이 정확히 생각한대로 실행되지 않을 수도 있습니다. – selalerer
VS2010과 동일한 동작을하지만 gcc v4.3.4에서는 [여기] (http://ideone.com/RlOjl)에 실패합니다. – hmjd
임시 개체가 생성되고 복사본이 최적화 된 상태 일 수 있습니다. 반환 값 최적화와 비슷합니다. –