Часто используемый оператор типа (void)x; позволяет подавлять предупреждения о неиспользуемой переменной x. Но если я попробую компилировать следующее, я получаю некоторые результаты, которые я не совсем понимаю:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Компилируя это с помощью g++, я получаю следующие предупреждения:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Итак, я пришел к выводу, что кастинг на void сильно отличается от кастинга на любые другие типы, будь то целевой тип, такой же, как decltype(x) или что-то другое. Мое предположение о возможных объяснениях:
- Это просто соглашение, что
(void)x;, но не другие броски будут подавлять предупреждения. Все утверждения одинаково не влияют. - Это различие каким-то образом связано с тем, что
void x;не является допустимым выражением, аshort x;-.
Какие из них, если они есть, являются более правильными? Если нет, то как объяснить разницу в предупреждениях компилятора?