-6
votes

Pourquoi accéder à une variable non déclarée au sein d'essayer Block ne provoque pas une exception en C ++

Je retouche mes compétences en C ++. Au cours de cela, je suis tombé sur la manipulation des exceptions et j'ai remarqué qu'une variable non déclarée ne provoque pas d'exception, qui est étrange pour moi.

Je m'attendais à ce programme de mettre fin à une exception non capturée (si le compilateur est correctement défini), Parce que dans le bloc d'essai, j'essaie d'accéder à une variable non déclarée. Est-ce que quelqu'un pourrait m'aider à comprendre pourquoi je ne reçois pas une exception (non capturée)? xxx


8 commentaires

Quelle variable non déclarée? Les fonctions se décomposent aux pointeurs à eux-mêmes, et c'est ce qui se passe avec l'expression puissante : il se désintègre à & puissante , puis le résultat (le pointeur) est simplement ignoré et jeté.


Vous n'accédez pas à une variable non déclarée, mais mentionnez simplement un pointeur de fonction dans une déclaration.


NB: Activez les avertissements du compilateur!


De plus, si vous vraiment avait une variable non déclarée que vous avez essayé d'utiliser, alors cela conduirait à une erreur de construction , pas une exception au moment de l'exécution.


Et même s'il s'agissait de la "variable non déclarée", il ne jetterait pas une exception (exécution) mais entraînerait une erreur de compilateur.


Un compilateur raisonnable devrait produire le message "AVERTISSEMENT: déclaration n'a aucun effet" ou quelque chose à cet effet. Pensez à augmenter le niveau d'avertissement lors de la compilation.


@SomeProGrammerDude fait que le nom d'une fonction se décompose réellement dans une expression de valeur rebartée? Et cela compte-t-il de quelque manière que ce soit, qu'il se désintègre ou non?


En C ++, une exception est quelque chose que Votre code crée avec lancer . Il y a beaucoup de choses qui sont appelées "exceptions", en particulier dans le domaine de l'arithmétique de point flottant, mais elles ne sont pas c ++ exceptions. Si vous ne Jetez , ce n'est pas une exception.


4 Réponses :


0
votes

Vous n'appelez pas maygowrong , donc il ne fait pas le lancer

puissantgowrong; n'est pas un accès non valide, il vient de renvoyer l'adresse de la fonction

Nous ne sommes pas comme dans Java où la machine virtuelle lancer des exceptions en soi, en C ++, les exceptions doivent être explicitement lancées


2 commentaires

Ce ne serait pas une exception en Java non plus, bien que vous ayez raison que la langue ne déclenche jamais un lancer de la manière dont la "mise en œuvre" Java pourrait. Bien sûr, les fonctions de la bibliothèque peuvent, mais elles vivent dans "l'espace utilisateur", donc ce n'est pas tout à fait une comparaison juste.


@LightnessRacksinorbit Dans ce cas Oui, je parle en général



3
votes

Le puissantgowrong; -Statement de votre Essayez -Block ne se réfère pas à une variable mais à fonctionner puissantgowrong () ; Notez que vous n'appelez pas la fonction mais utilisez simplement son nom sans l'attribuer à quelque chose; Comme le symbole puissante est connu, il ne s'agit que d'une "non opération", cédant probablement des avertissements, mais pas une erreur lors de la compilation, et - comme cela ne fera pas appeler la fonction - il ne jette rien de au moment de l'exécution.

ESSAYER MAILGOWRONG () Au lieu de cela et voyez ce qui se passe.


0 commentaires

1
votes

Nommer les variables qui n'existent pas ne provoquent pas une exception; Il provoque un échec de compilation de votre programme.

Mais vous ne le faites pas. Vous nommez une fonction. Vous n'avez pas appelé cela et vous n'avez rien fait avec cela, mais vous nommez que c'est légal et est un «non-op», c'est-à-dire une déclaration qui ne fait rien.

C'est un peu comme faire cela : xxx

totalement inutile (et votre compilateur émettra probablement un avertissement), mais pas illégal!

Pourquoi n'est-ce pas illégal quand c'est inutile? Eh bien, pas de grande raison. Il n'y a tout simplement aucun point qui l'interdire.


2 commentaires

Pour le souci de Nitpicks et prouvant que rien n'est vraiment inutile en C ++: un ensemble de surcharge ne peut pas apparaître dans une expression rejetée, ni une fonction indéfinie auto . Cela peut être détecté avec Sfinae et réagi sans essayer d'appeler ou d'assumer quoi que ce soit d'autre sur la fonction :)


@Quentin heh, chiffres: D



0
votes

remarqué qu'une variable non déclarée ne provoque pas d'exception

Du point de vue de la langue, il n'existe pas de "variable non déclarée". Un identifiant est une variable lorsqu'elle a été déclarée variable. Si quelque chose n'a pas été déclaré, alors ce n'est pas une variable.

Peu importe, si vous utilisez un identifiant non déclaré , alors le programme est mal formé. La norme ne dit pas que des programmes mal formés lancent une exception et, à mesure que de telles attentes sont erronées. En fait, la norme n'exige pas que des programmes mal formés soient compilés avec succès et, en cas d'identificateur non déclaré, je ne m'attendrais pas à ce que aucun compilateur le fasse.

puissante n'est ni non déclaré, ni une variable. Il est déclaré être une fonction. Le comportement de puissantgowrong; n'est pas de jeter une exception. En fait, cette déclaration n'a aucun effet. Bien que de telles déclarations soient bien formées, elles sont rarement ce que le programmeur est intégré et, en tant que tel, il est probable que le compilateur délivrerait un avertissement au programmeur. Dans ce cas, vous pouvez voir: xxx


0 commentaires