Ответ 1
Возможно, чтобы избежать предупреждения компиляции, потому что c
не используется?
Извините за неопределенный заголовок, но не совсем уверен, как его выражать. Таким образом, я просматривал внутренности boost:: asio (пытаясь отследить некоторые смешные задержки), и я замечаю код, подобный этому:
op_queue<operation> completed_ops;
task_cleanup c = { this, &lock, &completed_ops };
(void)c; // EH?
Теперь из имени инициализируемой структуры я предполагаю, что с помощью RAII сделать некоторые шаги по уничтожению - отлично, но какова цель последней строки? Я просто пропустил что-то совершенно фанковое?
Возможно, чтобы избежать предупреждения компиляции, потому что c
не используется?
Вероятно, это потому, что это кросс-платформенный способ заставить компилятор не жаловаться на неиспользуемую переменную.
Вопрос, вероятно, заключался в том, почему он использовал, и на это уже был дан ответ. Я собираюсь рассказать о том, что это значит (что, вероятно, ОП знает, но другие не могут). По крайней мере, еще один вопрос был закрыт как дубликат этого.
В общем случае выражение для выражения void
оценивает выражение и отбрасывает результат, если таковой имеется. В этом случае выражение c
, имя переменной типа task_cleanup
(независимо от того, что есть).
Выражение, за которым следует точка с запятой, является выражением выражения. Когда оператор выполняется, выражение оценивается и его результат отбрасывается.
Итак, это:
(void)c;
оценивает c
(что, поскольку c
- это просто нелетучий объявленный объект, просто извлекает значение объекта), затем отбрасывает результат, а затем снова отбрасывает результат.
Семантически это не имеет большого смысла. Вы могли бы просто написать:
c;
или даже опустить его полностью с точно таким же эффектом.
Цель, как уже говорилось в других ответах, заключается в подавлении предупреждения о том, что значение переменной не используется. Без трансляции многие компиляторы будут предупреждать, что результат будет отброшен. При использовании броска большинство компиляторов предположит, что вы намеренно отбрасываете значение и не будете предупреждать об этом.
Это не гарантия; компиляторы могут предупреждать о чем угодно. Но приведение к void
является достаточно распространенным соглашением о том, что большинство компиляторов не выдаст предупреждение.
Вероятно, было бы полезно вызвать переменную ignored
, а не c
, и комментарий определенно был бы полезен.