Зачем использовать неиспользуемые возвращаемые значения для void?

int fn();

void whatever()
{
    (void) fn();
}

Есть ли какая-либо причина для литья неиспользуемого возвращаемого значения в пустоту, или я прав, считая это пустой тратой времени?

Последующие действия:

Хорошо, что кажется довольно всеобъемлющим. Я полагаю, что это лучше, чем комментировать неиспользованное возвращаемое значение, поскольку код самодокументирования лучше комментариев. Лично я выключу эти предупреждения, так как это лишний шум.

Я буду есть мои слова, если из-за этого исчезнет ошибка...

Ответ 1

David answer в значительной степени охватывает мотивацию этого, чтобы явно показать другим "разработчикам", что вы знаете, что эта функция возвращается, но вы явно игнорируете ее.

Это способ гарантировать, что при необходимости коды ошибок всегда обрабатываются.

Я думаю, что для С++ это, вероятно, единственное место, в котором я предпочитаю использовать C-style casts, так как использование полной статической нотной записи просто кажется излишним. Наконец, если вы просматриваете стандарт кодирования или пишете его, то также следует четко указать, что вызовы перегруженных операторов (не используя нотацию функций) также должны быть освобождены:

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.

Ответ 2

На работе мы используем это, чтобы признать, что функция имеет возвращаемое значение, но разработчик утверждает, что ее можно игнорировать. Поскольку вы отметили вопрос как С++, вы должны использовать static_cast:

static_cast<void>(fn());

Что касается компилятора, то приведение значения возвращаемого значения в void имеет мало смысла.

Ответ 3

Истинная причина для этого датируется инструментом, используемым для кода C, называемым lint.

Он анализирует код, который ищет возможные проблемы, и выдает предупреждения и предложения. Если функция вернула значение, которое затем не было отмечено, lint будет предупреждать, если это было случайно. Чтобы отключить lint при этом предупреждении, вы вызываете вызов (void).

Ответ 4

Отбрасывание void используется для подавления предупреждений компилятора для неиспользуемых переменных и несохраненных возвращаемых значений или выражений.

В стандарте (2003) говорится, что в п. 5.2.9/4 говорится:

Любое выражение может быть явно преобразовано в тип "cv void". Значение выражения выбрано.

Итак, вы можете написать:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

Все формы действительны. Я обычно делаю это короче:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

Его тоже хорошо.

Ответ 5

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

Ответ 6

Бросить в пустоту без затрат. Это только информация для компилятора, как ее обрабатывать.

Ответ 7

В C, отлично отбрасывать на void. Практически любой будет понимать намерение заявления.

В С++ у вас есть другие инструменты в вашем распоряжении. Поскольку C-ролики обычно не одобряются, и поскольку явный приведение к пустоте, вероятно, удивит ваших коллег (это меня удивляет), у меня есть этот шаблон функции где-то

template <typename T>
void use_expression(const T&) {}

и я использую

...
use_expression(foo());

где я писал бы (void)foo() в C.

Ответ 8

Также, когда ваш код соответствует стандарту MISTA (или другим), автоматические инструменты, такие как LDRA, не позволят вам вызывать функцию с типом возвращаемого значения без возврата значения, если вы явно не передали возвращаемое значение ( недействительный)