2015-03-08 12 views
7

W C++ podczas rzucania obiektem według wartości, jak: throw Exception(), utworzy to obiekt tymczasowy, w jaki sposób może zostać przechwycony przez odniesienie? Wiem, że to działa, ale jeśli byłaby to funkcja zwracająca wartość lub wywołanie funkcji, to by się nie udało bez dodawania const do typu, jaka jest różnica?Wyjątki C++ rzucane przez wartość catch przez odwołanie

+4

Wyjątkiem są różne zwierzęta, mają swoją własną semantykę. –

+0

możesz rozwinąć? – shd

+0

to długi temat ... 3 godziny wyjaśnień tutaj: https://www.youtube.com/watch?v=W7fIy_54y-w IIRC, książka Scotta Meyersa zawiera również rozdziały na ten temat ... –

Odpowiedz

6

pierwsze, kiedy piszesz

throw Exception(); 

co jest wyrzucane w rzeczywistości nie jest tymczasowy obiekt utworzony przez prvalue ekspresji Exception(). Koncepcyjnie istnieje oddzielny obiekt - obiekt wyjątku - zainicjowany z tego tymczasowego obiektu i jest to obiekt wyjątku, który jest faktycznie rzucany. (Kompilatory mogą jednak usunąć kopię/przenieść.)

Po drugie, reguły językowe mówią, że obiekt wyjątku jest zawsze uważany za lwartość. W związku z tym dopuszcza się powiązanie z niestanowiącymi stałych wartościami lwartości.

Powiązane problemy