Структура объединения 'punning' с “общей начальной последовательностью”: почему в C (99+), но не в C ++, предусмотрено «видимое объявление типа объединения»?

Фон

Обсуждение по большей части не определяемой реализацией природы наказания типов черезunion обычно заключают в кавычки следующие биты, здесь через @ecatmur (https://stackoverflow.com/a/31557852/2757035 ), об освобождении от стандартной компоновкиstructс «общей начальной последовательностью» типов элементов:

C11 (6.5.2.3 Структура и члены профсоюза; Семантика):

[...] если объединение содержит несколько структур, которые имеют общую начальную последовательность (см. ниже), и если объект объединения в настоящее время содержит одну из этих структур, разрешается проверять общую начальную часть любой из нихвезде, где видна декларация завершенного типа объединения, Две структуры разделяютобщая начальная последовательность если соответствующие члены имеют совместимые типы (и, для битовых полей, одинаковой ширины) для последовательности из одного или нескольких начальных элементов.

C ++ 03 ([Class.mem] / 16):

Если POD-объединение содержит две или более POD-структуры, которые имеют общую начальную последовательность, и если объект POD-union в настоящее время содержит одну из этих POD-структур, разрешается проверять общую начальную часть любой из них. Две POD-структуры совместно используют общую начальную последовательность, если соответствующие элементы имеют совместимые с макетом типы (и, для битовых полей, одинаковой ширины) для последовательности из одного или нескольких начальных элементов.

Другие версии двух стандартов имеют похожий язык; начиная с C ++ 11 используемая терминологиястандартный макет скорее, чемPOD.

Поскольку никакой реинтерпретации не требуется, на самом деле это не наказание за тип, а просто подстановка имениunion доступ к членам. Предложение для C ++ 17 (печально известный P0137R1) делает это явным, используя язык типа «доступ такой, как если бы был назначен другой член структуры».

Но обратите внимание, жирный шрифт - "везде, где видна декларация завершенного типа объединения«- пункт, который существует в C11, но нигде в черновиках C ++ для 2003, 2011 или 2014 года (все почти идентичны, но более поздние версии заменяют« POD »новым терминомстандартное расположение). В любом случае, «видимая декларацияunion Бит типа полностью отсутствует в соответствующем разделе любого стандарта C ++.

@loop и @ Mints97, здесь -https://stackoverflow.com/a/28528989/2757035 - показать, что эта линия была такжеотсутствует в C89, впервые появился в C99 и оставаясь в C с тех пор (хотя, опять же, никогда не фильтруя до C ++).

Обсуждение стандартов вокруг этого

[отрезал - см. мой ответ]

Вопросы

Отсюда мои вопросы:

Что это значит? Что классифицируется как «видимая декларация»? Намерен ли этот пункт сузить или расширить диапазон контекстов, в которых такое «наказание» определило поведение?

Должны ли мы предполагать, что это упущение в C ++ является очень преднамеренным?

Чем отличается C ++ от C? С ++ просто «унаследовал» это от С89, а затем либо решил - либо хуже,забывать - обновить вместе с C99?

Если разница намеренная, токакие преимущества или недостатки есть у 2 различных обработок в C против C ++?

Какие, если таковые имеются, интересные последствия он имеет во время компиляции или во время выполнения? Например, @ecatmur в комментарии, отвечающем на мое указание на его первоначальный ответ (ссылка выше), размышлял о следующем.

Я предполагаю, что это позволяет более агрессивную оптимизацию; C может предположить, что аргументы функцииS* s а такжеT* t не псевдоним, даже если они имеют общую начальную последовательность, пока нетunion { S; T; } в то время как C ++ может сделать это предположение только во время ссылки. Возможно, стоит задать отдельный вопрос об этой разнице.

Ну вот и я, спрашиваю! Меня очень интересуют любые мысли по этому поводу, особенно: другие соответствующие части (или) Стандарта, цитаты от членов комитета или других уважаемых комментаторов, идеи от разработчиков, которые могли заметить практическую разницу из-за этого - если предположить, что любой компилятор даженадоедает обеспечить соблюдение добавленного предложения C и т. д. Цель состоит в том, чтобы создать полезный каталог соответствующих фактов об этом предложении C и его (преднамеренном или нет) исключении из C ++. Итак, начнем!