Что означает "(void) new" означает в С++?

Я смотрел Qt tutorial, который использует конструкцию, которую я раньше не видел:

 (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) в основном говорит компилятору игнорировать результат этого выражения (после его вычисления).

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

Если вас интересуют технические требования (цитирование из стандарта С++, раздел 5):

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

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

Ответ 2

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

Ответ 3

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