Я ищу официальное объяснение этого факта в Стандарте. Я нашел то, что говорит 3.9.1/9, и пытаюсь дать объяснение, используемое в этом разделе.
Раздел 3.9.1/9, N3797:
Тип void имеет пустой набор значений. Тип void - это неполный тип, который не может быть завершен. Он используется как возврат type для функций, которые не возвращают значение. Любое выражение может быть явно преобразованный в тип cv void (5.4). Выражение типа void должен использоваться только как оператор выражения (6.2), как операнд запятое выражение (5.18), как второй или третий операнд: (5.16), как операнд typeid, noexcept или decltype, как выражение в оператор возврата (6.6.3) для функции с возвратным типом void, или как операнд явного преобразования в тип cv void.
Я не понимаю, как это связано с тем, что тип void имеет пустой набор значений?
Предположим, что тип T имеет пустой набор значений. Почему компилятор выдает ошибку, когда встречается следующая строка:
extern T v;
Мы можем декалировать переменную неполного типа следующим образом:
#include <iostream>
#include <cstring>
using namespace std;
struct Foo;
extern Foo f; //OK!
int main()
{
}
и он отлично работает
Это не может быть сделано для типа void
#include <iostream>
#include <cstring>
using namespace std;
extern void f; //compile-time error
int main()
{
}