Предположим, что у меня есть класс под названием A и указатель void vp. Может ли следующее вызвать исключение?Может ли сам reinterpret_cast вызывать исключение?
A *ap = reinterpret_cast<A*>(vp);
Спасибо, Fijoy
Предположим, что у меня есть класс под названием A и указатель void vp. Может ли следующее вызвать исключение?Может ли сам reinterpret_cast вызывать исключение?
A *ap = reinterpret_cast<A*>(vp);
Спасибо, Fijoy
Допуская (который вы можете в вашем случае, поскольку это типа void*
) в выражениеvp
не бросает исключение (это может сделать, если это был объект такого типа, который имел ручную работу оператора преобразования, который вызвал исключение), то
A *ap = reinterpret_cast<A*>(vp);
Виль Я сам не делаю исключения.
разыменованияap
может вызвать исключение выброшено поэтому.
Как можно разыменовывать неверный указатель, вызывая исключение? Я мог понять segfault. – BoBTFish
Поведение не определено. Таким образом, он * может * выбросить исключение. Это может даже съесть вашу кошку. – Bathsheba
У меня такой же вопрос. Разве разыменование или доступ к элементу ap генерирует исключение, или это будет segfault? –
Нет, ни один из reinterpret_cast<T>
, ни его эквивалент литья в стиле C не выполняют никаких проверок, поэтому сами по себе не могут вызвать исключение. Очевидно, что, поскольку обе конструкции примерно такие же небезопасные, как и они, разыменование указателя результата ap
может привести к неопределенному поведению.
Нет. Это чисто компиляционная конструкция. Это очень опасно, потому что это позволяет вам уйти с очень неправильными преобразованиями. – BoBTFish