Я уже знаю, что делает const_cast. Однако я хотел бы знать, как он работает. Что именно делает компилятор, когда видит const_cast?

2
Gabriel de Grimouard 4 Сен 2016 в 00:45

3 ответа

Лучший ответ

Напомним, что const_cast безопасно, только если фактическая переменная объявлена ​​неконстантной. Поскольку все, что делает const_cast<T>(...) - это удаляет const - ность из типа * , он в основном не делает ничего, кроме сообщения компилятору, что вы знаете, что делаете. Постоянство - это концепция времени компиляции, поэтому ее отбрасывание также происходит внутри компилятора.

*

6
Community 23 Май 2017 в 12:22

Конечно, это зависит от компилятора.

Но, упрощенно говоря, компилятор переводит код в каждой области (функциональный блок, вложенные блоки и т. Д.) Во внутреннее представление переменных / объектов и последовательность операций над ними. Объекты могут иметь имена (например, соответствующие переменным, объявленным в вашем коде) или безымянные (например, временные). Используя это представление, он будет отслеживать cv-квалификацию каждого объекта (отмечен ли он const, volatile или их комбинацией) и будет проверять правильность операций с объектами (например, отклонить присвоение const int после инициализации).

Когда он встречает const_cast, компилятор зарегистрирует запись с другой квалификацией const и соответственно выполнит свои последующие проверки до конца содержащейся области.

Все это происходит во время компиляции. В генерируемом объектном коде часто не будет свидетельств этого, особенно если компилятор распознает, что два указателя ссылаются на один и тот же объект, только с разными cv-квалификациями.

2
Peter 3 Сен 2016 в 22:13

const_cast не компилируется ни по каким инструкциям; он просто возвращает то же значение с удаленными cv-квалификаторами. Это способ сломать систему типов, которая обычно предотвращает изменение объекта const (или объекта, отличного от - const, через значение gl const).

4
Brian 3 Сен 2016 в 21:49