Często używana instrukcja, taka jak (void)x;
, pozwala ukryć ostrzeżenia o nieużywanej zmiennej x
. Ale gdy próbuję kompilacji następuje, mam pewne rezultaty ja nie bardzo rozumiem:Co naprawdę robi casting do `void`?
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Kompilacja ta z g ++, dostaję następujące ostrzeżenia:
$ 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;
^
więc stwierdzić, że rzucając się void
różni się bardzo od rzutowania do innych typów, być typem docelowym takim samym jak decltype(x)
lub czymś innym. Domyślam się możliwych wyjaśnień jest:
- Jest to tylko konwencja, że
(void)x;
ale nie inne odlewy wstrzyma ostrzeżenia. Wszystkie stwierdzenia jednakowo nie mają żadnego efektu. - Ta różnica jest w jakiś sposób związana z faktem, że
void x;
nie jest prawidłową instrukcją, gdyshort x;
jest.
Które z poniższych stwierdzeń są bardziej poprawne? Jeśli nie, to w jaki sposób można wyjaśnić różnicę w ostrzeżeniach kompilatora?
Jest to tylko konwencja między kompilatory, że ta obsada Pomija ostrzeżenia. Standard C++ nie wspomina o ostrzeżeniach, ponieważ "instrukcja nie ma żadnego efektu". –