Ce n'casting de "void" vraiment?

Souvent utilisé déclaration comme (void)x; permet de supprimer les avertissements sur unused variable x. Mais si j'essaie de compiler le suivant, je obtenir certains résultats, je ne comprends pas très bien:

int main()
{
    int x;
    (short)x;
    (void)x;
    (int)x;
}

De la compilation avec g++, je reçois les mises en garde suivantes:

$ 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;
           ^

J'en conclus que la coulée de void est très différente de la conversion d'autres types, être le type de cible le même que decltype(x) ou quelque chose de différent. Je pense à des explications possibles est:

  • C'est juste une convention qui (void)x; mais pas les autres distributions qui va supprimer les avertissements. Toutes les déclarations tout aussi de ne pas avoir d'effet.
  • Cette différence est en quelque sorte lié au fait que void x; n'est pas une instruction valide alors que short x; est.

Laquelle de ces si tout est correct? Si aucun, alors comment peut-on la différence dans les avertissements du compilateur être expliqué?

  • C'est juste une convention entre les compilateurs que cette distribution supprime les avertissements. La Norme C++ ne fait pas mention de mises en garde pour "l'instruction n'a pas d'effet" à tous.
InformationsquelleAutor Ruslan | 2015-12-15