Я пытаюсь понять связь enumeration constant
с и не смог найти четкого ответа в Стандарте N1570
.6.2.2(p6)
:
Следующие идентификаторы не имеют связи: идентификатор, объявленный как что-либо, кроме объекта или функции;идентификатор, объявленный как параметр функции;идентификатор области блока для объекта, объявленного без спецификатора класса хранения extern
.
Поэтому мне нужно понять, что константы не являются объектами.Объект определяется как 3.15
:
область хранения данных в среде выполнения, содержимое которой может представлять значения
Также 6.2.2(p4)
(выделите мое):
Для идентификатора, объявленного с помощью спецификатора класса хранения extern в области видимости, в которой видно предыдущее объявление этого идентификатора, 31) если в предыдущем объявлении указана внутренняя или внешняя связь, связьидентификатор в более позднем объявлении такой же, как связь, указанная в предыдущем объявлении. Если никакое предыдущее объявление не видно или если в предыдущем объявлении не указана связь, то идентификатор имеет внешнюю связь .
В любом случае 6.4.4.3(p2)
:
Идентификатор, объявленный как константа перечисления, имеет тип int
.
Объединяя все, что я не понимаю, почему
enum test {
a = 1
};
extern int a; //compile-error. UB?
не компилируется?Я ожидал, что a
будет иметь внешнюю связь.
LIVE DEMO
Хорошо ли определено поведение?Можете ли вы дать ссылку на стандарт, объясняющий это?