Определяет ли следующий код в C?
int main() {
const int i = 0;
return *(int*)(&i);
}
Я спрашиваю, потому что 6.5/7 перечисляет "квалифицированную версию типа, совместимую с эффективным типом объекта" как действительный псевдоним. Но эффективный тип объекта const int
, и я не думаю, что int
- это квалифицированная версия const int
(хотя верно обратное). Не совместимы int
и const int
(6.7.3/10).
Кроме того, в 6.3.2.3/2 говорится, что вы можете преобразовывать типы указателей, добавляя квалификаторы, и что полученный указатель равен. 6.3.2.3/7 говорит, что вы можете конвертировать любые два типа указателей (поэтому разрешен листинг (int*)(&i)
). Но не говорит, что полученный указатель относится к одному и тому же объекту или даже к тому, что он равен. Все, что он говорит, это то, что он может быть преобразован обратно в исходный тип (в данном случае const int*
). То есть, даже если псевдоним легален, мне не ясно, что стандарт гарантирует, что мое преобразование указателя действительно приведет к указателю, который ссылается на i
.
Итак, действительно ли стандарт определяет поведение моего кода, и если да, то где это определено?
Я знаю, что код работает на практике. Я имею в виду гипотетическую (и причудливую) реализацию, на которой она не работает. Я мог бы спросить, соответствует ли эта реализация стандарту (а если нет, в какой части он нарушает), но я не хочу мутить воды, если есть другие отношения, в которых моя воображаемая реализация не соответствует. Я опишу реализацию, если кто-нибудь подумает, что это поможет им ответить на вопрос.