Как объяснено, например, здесь, мы все знаем о 3 основных применениях для ключевого слова void (более опытные программисты на C/С++ могут перейдите к четвертому использованию):
1) В качестве типа возврата для функции, которая ничего не возвращает. Эта вызовет пример кода следующим образом:
void foo();
int i = foo();
чтобы сгенерировать ошибку компилятора.
2) В качестве единственного параметра в списке параметров функции. AFAIK, пустой список параметров функции точно совпадает с компилятором, и поэтому следующие две строки идентичны по смыслу: ( edit:, это верно только в С++. Комментарии показывают разницу в c).
int foo();
int foo(void);
3) void * является специальным типом общего указателя - он может указывать на любую переменную, которая не объявляется с ключевым словом const или volatile, конвертировать в/из любого типа указателя данных и указывают на все функции, не являющиеся членами. Кроме того, он не может быть разыменован. Я не буду приводить примеры.
Существует также четвертое использование, которое я не совсем понимаю:
4) В условной компиляции он часто используется в выражении (void) 0 следующим образом:
// procedure that actually prints error message
void _assert(char* file, int line, char* test);
#ifdef NDEBUG
#define assert(e) ((void)0)
#else
#define assert(e) \
((e) ? (void)0 : \
__assert(__FILE__, __LINE__, #e))
#endif
Я пытаюсь понять поведение этого выражения в экспериментах. Все следующие юридические (хорошо компилируются):
int foo(); // some function declaration
int (*fooPtr)(); // function pointer
void(foo);
void(fooPtr);
void(0);
(void)0;
void('a');
void("blabla");
exampleClass e; //some class named exampleClass with a default ctor
void(e);
static_cast<void>(e);
но это не так:
void(0) // no semicolon
int i = void(0);
Могу ли я заключить из этого, что "void" (в контексте 4-го использования) - это просто специальный тип, который может использовать любой тип (будь то c-style или cpp- стиль), и он никогда не может использоваться как lvalue или rvalue?