Я ищу формальное объяснение этого факта в Стандарте. Я нашел то, что говорит 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()
{
}
и она работает нормально
Это не может быть сделано по пустому типу
#include
#include
using namespace std;
extern void f; //compile-time error
int main()
{
}