Подтвердить что ты не робот

Какова цель утверждения "(void) c?"?

Извините за неопределенный заголовок, но не совсем уверен, как его выражать. Таким образом, я просматривал внутренности boost:: asio (пытаясь отследить некоторые смешные задержки), и я замечаю код, подобный этому:

    op_queue<operation> completed_ops;
    task_cleanup c = { this, &lock, &completed_ops };
    (void)c;  // EH?

Теперь из имени инициализируемой структуры я предполагаю, что с помощью RAII сделать некоторые шаги по уничтожению - отлично, но какова цель последней строки? Я просто пропустил что-то совершенно фанковое?

4b9b3361

Ответ 1

Возможно, чтобы избежать предупреждения компиляции, потому что c не используется?

Ответ 2

Вероятно, это потому, что это кросс-платформенный способ заставить компилятор не жаловаться на неиспользуемую переменную.

Ответ 3

Вопрос, вероятно, заключался в том, почему он использовал, и на это уже был дан ответ. Я собираюсь рассказать о том, что это значит (что, вероятно, ОП знает, но другие не могут). По крайней мере, еще один вопрос был закрыт как дубликат этого.

В общем случае выражение для выражения void оценивает выражение и отбрасывает результат, если таковой имеется. В этом случае выражение c, имя переменной типа task_cleanup (независимо от того, что есть).

Выражение, за которым следует точка с запятой, является выражением выражения. Когда оператор выполняется, выражение оценивается и его результат отбрасывается.

Итак, это:

(void)c;

оценивает c (что, поскольку c - это просто нелетучий объявленный объект, просто извлекает значение объекта), затем отбрасывает результат, а затем снова отбрасывает результат.

Семантически это не имеет большого смысла. Вы могли бы просто написать:

c;

или даже опустить его полностью с точно таким же эффектом.

Цель, как уже говорилось в других ответах, заключается в подавлении предупреждения о том, что значение переменной не используется. Без трансляции многие компиляторы будут предупреждать, что результат будет отброшен. При использовании броска большинство компиляторов предположит, что вы намеренно отбрасываете значение и не будете предупреждать об этом.

Это не гарантия; компиляторы могут предупреждать о чем угодно. Но приведение к void является достаточно распространенным соглашением о том, что большинство компиляторов не выдаст предупреждение.

Вероятно, было бы полезно вызвать переменную ignored, а не c, и комментарий определенно был бы полезен.