Почему мы не можем объявить переменную типа void?

Я ищу формальное объяснение этого факта в Стандарте. Я нашел то, что говорит 3.9.1 / 9, и пытаясь дать объяснение, использовал этот раздел.

Раздел 3.9.1 / 9, N3797 :

Тип void имеет пустой набор значений. Тип void является неполным типом, который не может быть завершен. Он используется в качестве типа возврата для функций, которые не возвращают значение. Любое выражение может быть явно преобразовано в тип 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 
#include 

using namespace std;

struct Foo;

extern Foo f; //OK!

int main()
{
}

и она работает нормально

DEMO

Это не может быть сделано по пустому типу

#include 
#include 

using namespace std;

extern void f; //compile-time error

int main()
{
}

DEMO

38
задан John Dibling 15 September 2014 в 17:30
поделиться