2014-09-14 2 views
5

Как эта программа скомпилирована в порядке?Что означает "void();" как отдельный оператор означает в C++?

int main() { 
    void(); // Does this create a "void" object here? 
} 

Я тестировал как под MSVC, так и GCC. Но void является неполным типом. Когда вы делаете то же самое для любого другого неполнома определяемого пользователя типа,

class Incomplete; 

int main() { 
    Incomplete(); // Error saying "Incomplete" is incomplete. 
} 
+3

'void' не имеет конструктора. – chris

+0

@chris Да, но это похоже на 'int()' или 'float()'. – Alex

+4

@Alex: 'int' и' float' также не имеют конструкторов. – AnT

ответ

3

void тип есть и всегда был особенным. Это действительно неполно, но допускается во многих контекстах, где обычно ожидается полный тип. В противном случае, например, определение функции void было бы недействительным из-за неполноты типа void. Также возможно написать выражения типа void (любой вызов функции void является примером такого выражения).

Даже на языке C вы можете использовать оперативные выражения типа void типа (void) 0. То, что у вас есть в вашем коде, - всего лишь пример синтаксиса C++, который делает практически то же самое: он создает выражение no-op типа void.

11

C++ 11 §5.2.3 [expr.type.conv]/2 идет в подробность (курсив мой):

Выражение T(), где T является спецификатором простого типа или спецификатором имени для типа объекта без массива или (возможно, cv-qualified) типа void, создает prvalue указанного типа, значение которого выражается посредством инициализации значения (8.5) объекта типа T; нет инициализация делается для void() кейс.

Это просто оценка типа void. Никакой специальной инициализации или ничего подобного int() не было бы. Значение proke - это что-то вроде true, или nullptr, или 2. Выражение эквивалентно 2;, но для void вместо int.

2

В C++ допускается, чтобы тип void можно использовать в качестве аргумента шаблона.