Что значит & # 8220; (void) new & # 8221; значит в С ++?

StackOverflow https://stackoverflow.com/questions/1029743

  •  06-07-2019
  •  | 
  •  

Вопрос

Я просматривал учебник , посвященный Qt. раньше не видел:

 (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) ?

Это было полезно?

Решение

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

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

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

  

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top