Почему void не принимает значение void в C++?

Мне любопытно, почему C++ не определяет void через :

typedef struct { } void;

Т.е.каково значение типа, который не может быть создан, даже если эта установка не должна создавать кода?

Если мы используем gcc -O3 -S, то обе следующие программы производят идентичный ассемблер:

int main() { return 0; }

и

template <class T> T f(T a) { }
typedef struct { } moo;
int main() { moo a; f(a); return 0; }

Это имеет смысл. Структура { }просто принимает пустое значение, которое достаточно легко оптимизировать. На самом деле, странно то, что они производят другой код без -O3.

Однако вы не можете провернуть тот же трюк, просто typedef void moo, потому что void не может принимать никаких значений, даже пустых. Имеет ли это различие какую-либо пользу?

Существуют различные другие языки со строгой типизацией, такие как Haskell и, предположительно, языки ML, которые имеют значение для своего типа void, но не предлагают явно бесполезных типов, хотя некоторые из них имеют собственные типы указателей, которые действуют как void *.

5
задан Jeff Burdges 2 April 2012 в 00:49
поделиться