Неопределяемые объявления для `void`" объектов ": какая часть стандарта C ++ запрещает их?Или это? - PullRequest
0 голосов
/ 30 декабря 2018

В стандарте 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), но, по-видимому, он не предназначен для полного списка.

1 Ответ

0 голосов
/ 30 декабря 2018

Я считаю, что соответствующие отрывки следующие:

[dcl.stc]

5 Спецификатор externдолжны применяться только к объявлению переменной или функции.

[basic]

6 A variable isвводится объявлением ссылки, отличной от нестатического члена данных или объекта.Имя переменной, если она есть, обозначает ссылку или объект.

[basic.types]

8 тип объекта - это (возможно, cv-квалифицированный) тип, который не является типом функции, не ссылочным типом и не cv void.

a, будучи объявлением переменной, должен обозначать ссылкуили объект в соответствии с [основным] ¶6.Это касается ссылок, которые на самом деле не являются типами объектов.Однако, поскольку void не является ни ссылкой, ни типом объекта, объявление является некорректным.

...