Выполнение выражения (void) в основном говорит компилятору игнорировать результат этого выражения (после его вычисления).
В вашем примере каждое из выражений (за оператор/строка) динамически выделяет память через новый оператор - и поскольку новый возвращает указатель (адрес) в память, обычная практика заключается в том, чтобы сохранить этот указатель в переменную, которую вы можете использовать, чтобы в конечном итоге удалить объект и освободить память. В вашем примере, поскольку указатель отбрасывается, явное приведение в действие (void) делает ясным намерение программиста: «Я точно знаю, что делаю, - пожалуйста, отбросьте значение, возвращаемое новым»
Если вы интересуется техническими особенностями (цитирование из стандарта C++, п. 5):
Любое выражение может быть явно преобразовано в тип cv void. Значение выражения отбрасывается. [Примечание: однако, если значение находится во временной переменной (12.2), деструктор для этой переменной не выполняется до обычного времени, а значение переменной сохраняется для выполнения деструктора. -end note]
Стандартные преобразования по стандарту lvalue-to-rvalue (4.1), стандартное преобразование с переменным числом-указателем (4.2) и стандартным преобразованием (4) не применяются к выражению.
И если вы хотите знать, как эти объекты становятся удалены (если они действительно становятся удалены), то ответ, что «это» указатель в конструкторе QShortcut должен иметь такое же значение, что и возвращаемый новыми , и это может быть передано в ShortcutManager. Обратите внимание: «это» внутри конструктора не совпадает с «этим» указателем, который передается конструктору QShortcut.
Превратите свой уровень предупреждения о компиляторе до макс. Скомпилируйте без (void) и посмотрите, что произойдет. –
Но большую часть времени я вижу это потому, что кто-то писал C и не понимает, что вы больше не пытаетесь преобразовать. –