Часто используемый оператор типа (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;
-.
Какие из них, если они есть, являются более правильными? Если нет, то как объяснить разницу в предупреждениях компилятора?