Ответ 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.