2009-06-22 3 views
10

Я смотрел на Qt tutorial который использует конструкцию, я не видел раньше:Что означает «(void) new» означает в C++?

(void) new QShortcut(Qt::Key_Enter, this, SLOT(fire())); 
(void) new QShortcut(Qt::Key_Return, this, SLOT(fire())); 
(void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close())); 

Я попытался это без (void) и он все еще собирает и работает, так что цель (void)?

+1

Превратите свой уровень предупреждения о компиляторе до макс. Скомпилируйте без (void) и посмотрите, что произойдет. –

+0

Но большую часть времени я вижу это потому, что кто-то писал C и не понимает, что вы больше не пытаетесь преобразовать. –

ответ

21

Выполнение выражения (void) в основном говорит компилятору игнорировать результат этого выражения (после его вычисления).

В вашем примере каждое из выражений (за оператор/строка) динамически выделяет память через новый оператор - и поскольку новый возвращает указатель (адрес) в память, обычная практика заключается в том, чтобы сохранить этот указатель в переменную, которую вы можете использовать, чтобы в конечном итоге удалить объект и освободить память. В вашем примере, поскольку указатель отбрасывается, явное приведение в действие (void) делает ясным намерение программиста: «Я точно знаю, что делаю, - пожалуйста, отбросьте значение, возвращаемое новым»

Если вы интересуется техническими особенностями (цитирование из стандарта C++, п. 5):

Любое выражение может быть явно преобразовано в тип cv void. Значение выражения отбрасывается. [Примечание: однако, если значение находится во временной переменной (12.2), деструктор для этой переменной не выполняется до обычного времени, а значение переменной сохраняется для выполнения деструктора. -end note]
Стандартные преобразования по стандарту lvalue-to-rvalue (4.1), стандартное преобразование с переменным числом-указателем (4.2) и стандартным преобразованием (4) не применяются к выражению.

И если вы хотите знать, как эти объекты становятся удалены (если они действительно становятся удалены), то ответ, что «это» указатель в конструкторе QShortcut должен иметь такое же значение, что и возвращаемый новыми , и это может быть передано в ShortcutManager. Обратите внимание: «это» внутри конструктора не совпадает с «этим» указателем, который передается конструктору QShortcut.

7

Некоторые компиляторы C++ выдают предупреждение, если вы выбрасываете возвращаемое значение такой функции. В этом случае код похож на утечку памяти, поэтому вы получаете предупреждение. (void) сообщает компилятору, чтобы он не выдавал предупреждение: «Относитесь к этой функции, как если бы она вернулась void».

0

Я думаю, что ссылка, возвращаемая из инструкции new, не назначена указателю. Я вижу, что this передается, поэтому QT должен что-то делать с этой ссылкой.

Смежные вопросы