2016-04-28 2 views
4

Предположим, что у меня есть класс под названием A и указатель void vp. Может ли следующее вызвать исключение?Может ли сам reinterpret_cast вызывать исключение?

A *ap = reinterpret_cast<A*>(vp); 

Спасибо, Fijoy

+2

Нет. Это чисто компиляционная конструкция. Это очень опасно, потому что это позволяет вам уйти с очень неправильными преобразованиями. – BoBTFish

ответ

5

Допуская (который вы можете в вашем случае, поскольку это типа void*) в выражениеvp не бросает исключение (это может сделать, если это был объект такого типа, который имел ручную работу оператора преобразования, который вызвал исключение), то

A *ap = reinterpret_cast<A*>(vp);

Виль Я сам не делаю исключения.

разыменованияapможет вызвать исключение выброшено поэтому.

+0

Как можно разыменовывать неверный указатель, вызывая исключение? Я мог понять segfault. – BoBTFish

+4

Поведение не определено. Таким образом, он * может * выбросить исключение. Это может даже съесть вашу кошку. – Bathsheba

+0

У меня такой же вопрос. Разве разыменование или доступ к элементу ap генерирует исключение, или это будет segfault? –

6

Нет, ни один из reinterpret_cast<T>, ни его эквивалент литья в стиле C не выполняют никаких проверок, поэтому сами по себе не могут вызвать исключение. Очевидно, что, поскольку обе конструкции примерно такие же небезопасные, как и они, разыменование указателя результата ap может привести к неопределенному поведению.

Смежные вопросы