Это правда, что const_cast - это просто способ сказать компилятору «стон стонать, рассматривать это как неконстантный указатель»? Есть ли случаи, когда const_cast сам переводится в фактический машинный код?Создает ли const_cast фактическую эмиссию кода?
ответ
Возможно, могут существовать архитектуры, в которых указатель const имел другое представление для неконстантного, и в этом случае компилятору пришлось бы испускать некоторый код. Однако я не знаю о таких архитектурах.
Умный, но не правдоподобный: только const - это атрибут, это не значит, что вы не можете писать (считайте изменяемые члены). Если вы задумываетесь о архитектуре, где указатели только для чтения и чтения и записи или только для записи различны, тогда код все равно не будет генерироваться при произведении, а не в самой записи. – Suma
Я намеренно не сказал _when_ компилятор должен был бы испустить некоторый код. – 2009-04-17 08:08:00
Неважно. Const_cast woud удаляет гипотетический «бит только для чтения» в указателе, который записывает в изменяемый элемент через указатель const. Последний может быть обнаружен с помощью 100% -ной точности компилятором. – MSalters
Нет, он просто удаляет атрибут 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
может перевернуть несущественные биты указателя, но любое неявное преобразование также может быть. Я не думаю, что этот случай существует в реальном мире.
То же самое применимо, если два разных битовых шаблона приводят к одному и тому же значению адреса (основание + смещение, когда смещение достаточно велико).
Да, это правда. – user51568