Не сопи бросания не вызывают фактических выбросов код?


Верно ли, что const_cast - это просто способ сказать компилятору: "перестань стонать, рассматривай это как неконстантный указатель"? Есть ли случаи, когдаconst_cast сам переводится в реальный машинный код?

4 8

4 ответа:

Возможно, существуют архитектуры, в которых указатель const имеет представление, отличное от неконстантного, и в этом случае компилятор должен будет выдать некоторый код. Однако я не знаю ни одной такой архитектуры.

Нет, он просто удаляет атрибут const во время компиляции.

Const_cast просто выбрасывает константу атрибута и ничего больше.

const не изменяет представление типа, в частности, представление T* точно такое же, как T const*.

Рассмотрим:

int i, 
    * const cpi = &i,
    * const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*

Представление cpi одновременно представляет собой int* и int const* через *pcpci.

Не существует способа для представления cpi, чтобы изменить, Когда pcpci инициализируется.

Конечно, если объекты указателя имеют несущественные биты, компилятор может переключать их случайным образом; в частности, const_cast может переверните несущественные биты указателя, но любое неявное преобразование может также. Я не думаю, что это дело существует в реальном мире.

То же самое применяется, когда два разных битовых шаблона приводят к одному и тому же значению адреса (база+смещение, когда смещение достаточно велико).