В следующем примере анонимный union объявляет элемент int i, который вводится в объемлющую область, а const предшествует объявлению объединения:
int main() {
const union {
int i = 0;
};
i = 1;
}
Компиляторы расходятся в обработке этой программы.
MSVC принимает объявление объединения, но отклоняет i = 1 с ошибкой:
ошибка C3892: «$ S1»: вы не можете присвоить переменную, которая является константой
GCC принимает всю программу без предупреждения, просто игнорируя префикс const.
Clang в режиме -pedantic-errors выдает ошибку:
анонимный союз не может быть «константным» [-Werror,-Wpedantic]
Какой компилятор здесь правильный?
Поскольку анонимный союз не объявляет переменные этого типа, а начальный const не является частью типа объединения, имеет смысл игнорировать/запрещать начальный const, ИМХО. Поведение MSVC, вероятно, является специфичным для Microsoft расширением. Однако ведущий const не упоминается в документации Microsoft.





Это известная проблема: определение подразумевает, что никакие другие спецификаторы decl не допускаются, что противоречит утверждениям о спецификаторах класса хранения. (В любом случае я не уверен, в чем смысл анонимного союза const.)
AFAIK, относящийся к союзу, также «активирует член», который меняет состояние объекта (союза). Я думаю, что это раздел, который описывает это: expr.const.5.10. Назначение неактивному члену не является постоянным выражением. (поведение IMO union на данный момент слишком сложное, и его следует избегать в пользу std::variant)