Type conversion to void (not to void*)
В описании к named requirement InputIterator в таблице приведено в пример выражение ((void)i++), на которое я никогда ранее не натыкался. В чём смысл каста к void и почему это вообще валидно?
Ответы (1 шт):
Канонический оператор постинкремента в выражении i++ выполняет следующие действия:
- запомнить текущее значение
i - увеличить
iна "единицу" (с учётом типа переменной) - вернуть прежнее значение
iдо увеличения
Причём возврат прежнего значения - это именно фишка пост-версии оператора. Если нет необходимости получать старое значение, а просто "шагнуть вперёд", то более правильным вариантом будет использование преинкремента. Соответственно, если результат работы постинкремента никак не использован в коде, то компилятор логично может предположить, что в коде допущена ошибка и выдать соответствующее предупреждение. Явно такая необходимость использования возвращаемого значения может быть указана с помощью атрибута [[nodiscard]]. А для подавления подобных предупреждений как раз и используется приведение к void. Т.е. этим мы сообщаем компилятору, что несмотря на использование постинкремента, возвращаемое значение нас не интересует.
В упомянутой вами таблице добавление (void) позволяет показать связь между выражениями i++ и ++i. То есть, если возвращаемые значения игнорируются, их действия эквиваленты, иначе они, конечно же, будут отличаться.