В стандарте C ++ есть по крайней мере два места, которые запрещают определять объекты с неполными типами (http://eel.is/c++draft/basic.def#5, http://eel.is/c++draft/basic.types#5). Однако, предоставляя неопределяемые объявления для объектов неполного типа, как правило, разрешено в C ++. И я, похоже, не могу точно определить конкретную часть, которая бы запретила объявлять неполные "объекты" типа void
таким образом. (Конечно, void
не тип объекта в C ++, но ни один не является ссылочным типом, для одного примера.) Итак, действительно ли это
extern void a;
действительно плохо сформировано в C ++?
В C, обеспечивающем неопределенноеобъявления для void
объектов (как показано выше) разрешены, и GCC и Clang принимают вышеупомянутое в коде C (определения, конечно, не допускаются). Но в коде C ++ оба компилятора выдают ошибки для таких объявлений. Какая частьстандарт заставляет их делать это?
[basic.fundamental]
перечисляет возможные варианты использования типа void
(http://eel.is/c++draft/basic.types#basic.fundamental-13), но, по-видимому, он не предназначен для полного списка.