J'ai rencontré ce "beau" exemple de code "très lisible" et "élégant", mais j'ai des problèmes de la compréhension: Voici ce que je comprends (veuillez me corriger si Je me trompe): p> Voici mes principales préoccupations: p> Je n'ai pas pu obtenir ce code à exécuter sur VS2013 Aperçu, je suppose donc que ces fonctionnalités n'étaient pas encore implémentées. P> Je suis très curieux de cela, alors je l'apprécierai si quelqu'un peut expliquer! Acclamations p> p>
f () code> est une fonction de membre de s code> li>
virtuel code> - peut être remplacé par des classes dérivées li>
inline code> - compilateur devrait tenter de générer le code em> pour un appel à f code> plutôt que de l'appeler normalement li>
const code> - la fonction n'est pas en mesure de modifier l'un des membres s code> s li>
noexcept code> - La fonction ne jettera jamais (ne peut pas lancer ou non autorisé à lancer) li>
const code> pointeur sur un const Unsigned long int code> li>
auto .... -> vide code> - type de retour vide code> li>
[[NORESTURN]] code> - il n'a jamais retour code> s li>
ul>
[[Noreturn]] code>, il jamais strong> retourne à son appelant; Alors, comment peut-il avoir un type de retour void code>? Quel est le point d'un type de retour dans cette fonction quand même? Li>
int code> au lieu de void code> par exemple? li>
} code>)? li>
ul>
4 Réponses :
Le Le but de l'attribut [[Noreturn]] code> est un attribut qui a la sémantique qu'elle a. Cela ne change pas, cependant, comment la fonction est déclarée: toutes les fonctions normales en C ++ (c'est-à-dire toutes les fonctions, à l'exception des constructeurs, destructeurs et des opérateurs de conversion) ont un type de retour déclaré. L'ajout d'un attribut ne change pas cette règle. P>
[[noreturn]] code> est probablement d'indiquer que la fonction ne revient jamais de manière normale. Étant donné que la fonction est également déclarée code> noexcept code> signifie essentiellement que la fonction correspondante ne peut également être lancée d'une exception. Un exemple de fonction avec un comportement similaire est Quitter () code> qui termine le programme. Je pouvais imaginer que les fonctions mettant en œuvre une sorte de boucle d'application pourraient également être admissibles. Dans tous les cas, le [[Noreturn]] code> indique au système que la fonction correspondante ne reviendra jamais normalement, c'est-à-dire la chute de la fonction ("après}") entraînera probablement un comportement non défini. p>
Si une fonction est déclarée [[Noreturn]], elle ne revient jamais à son appelant; Alors, comment peut-il avoir un vidage de type retour? Quel est le point d'un type de retour dans cette fonction quand même? P> blockQuote>
de Ce Q & A Vous pouvez voir que Nor ouTurn est Un moyen de dire au compilateur qu'une fonction ne renvoie pas. Normalement, cela signifie qu'il a une boucle infinie (souvent observée dans des serveurs censés fonctionner indéfiniment) ou cela appelle indéfiniment) ou appelle
sortie () code>,terminer () code> et similaire. l'application sans retourner à la main.
[[NORÉTURN]] CODE> est facultatif, c'est-à-dire que vous ne em> avez-vous em> pour spécifier. C'est un attribut, c'est-à-dire la syntaxe de base de la définition / la déclaration de la fonction restent intacte, de sorte que la fonction a em> doit avoir un type de retour comme toute autre fonction. P>Ce code compilait-il avec Int au lieu de void par exemple? p> blockQuote>
Oui, ce serait, bien que le compilateur puisse vous avertir que cela n'a pas de sens que quelque chose est retourné d'une fonction qui ne revient jamais. P>
Quelle serait une utilisation pratique pour une fonction comme celle-là? Jeter une exception? P> blockQuote>
La première chose qui vous vient à l'esprit est une boucle sans fin, par ex. Manipulation des demandes entrantes sur un serveur. Lancer une exception est correct pour
[[Noreturn]] code> fonctionne également, mais ce n'est pas vraiment une option ici, car il dit explicitementnoexcept code>. Lancerait déclencher un appel àstd :: terminer () code>, conduisant à la résiliation du programme lui-même mais préside à une quantité de mise en oeuvre définie de la pile déroulant, ce qui signifie en fait[[NORETURN]] code> serait toujours applicable. p>Où est-ce que le flux du code est passé après la fin de cette fonction exécutant (après})? p> blockQuote>
La fonction n'atteint jamais sa fermeture
} code>. Il fonctionne sans fin (jusqu'à ce que quelqu'un tire la fiche), ou il sort de manière anormale, c'est-à-dire par résiliation du programme. En d'autres termes, si la fonction n'exécute plus, elle n'a pas vraiment fini, mais a abandonné l'exécution em>, et il n'y a pas de programme et aucun flux de contrôle pour aller à. P>
Si je ne me trompe pas, une exception échappatoire noexcept code> fonctionne en appelant std :: Terminez code> et la pile peut ou non déroulé (mise en oeuvre définie). Donc, il peut-être i> entraîner des destructeurs appelés.
@Jrok Vous avez raison, c'était vieux C ++ 03 Info que j'avais - allez résoudre ce problème.
Les autres réponses sont excellentes, mais je vais présenter une réponse alternative pour
Si une fonction est déclarée sous forme
[[Noreturn]] code>, il ne revient jamais à son appelant; Alors, comment peut-il avoir un vidage de type retour? Quel est le point d'un type de retour dans cette fonction quand même? P> blockQuote>Une des raisons pour lesquelles vous pourriez avoir besoin d'un type de retour (et un type de retour non vides à cela) est si la fonction remplace une méthode Super Classes. P>
struct Parent { virtual int f()=0; } struct Child { [[noreturn]] override int f() noexcept { ... } };
Si une fonction est déclarée [[Noreturn]], elle ne revient jamais à son appelant; Alors, comment peut-il avoir un vidage de type retour? Quel est le point d'un type de retour dans cette fonction quand même? P>
J'ai trouvé un exemple pratique d'un non-vide
[[Noreturn]] code> fonction. C'est dans un cas, lorsqu'il est utilisé dans?: Code> Opérateur pour fournir un résultat correct de type?: Code> opérateur: p>xxx pré> < P> Remarque: on pourrait avoir un sentiment que [[noréturn]] code> fonctionne dans?: code> Opérateur pourrait être ignoré pour le calcul de?: code> résultat taper. Mais il n'est pas possible car[[NORETEURCH]] code> n'est pas une partie du type de résultat d'une expression (échoue("") code> a le type de résultat T code> et non[[NORETURN]] T code>). P>Quelle serait une utilisation pratique pour une fonction comme celle-là? Jeter une exception? P> blockQuote>
Voir l'exemple de cette fonction
échouer code> ci-dessus. p> blockquote>
@TemplaTerex En réalité, ce n'est pas un dupliqué car j'ai posé 4 questions à la fin qui nécessitent plus d'informations que ce qui a été répondu dans ce poste
Eh bien, ces autres questions sont insuffisamment prises en charge avec le code, c'est-à-dire un SSCCE et quoi-vous-t-il?
@TemplaTerex Je ne peux rien essayer car mon compilateur ne comprend même pas ce que
[[Noreturn]] code> signifie. J'ai besoin d'aide, c'est pourquoi je demande.Il y a beaucoup de compilateurs en ligne qui l'appuient, vous devriez vraiment mettre en œuvre plus d'efforts pour réduire votre question, car d'autres pour pouvoir vous aider
@Templatérex Comment puis-je le réduire? J'ai posé 4 questions spécifiques, j'ai besoin de répondre pour eux! Ceci est un site Web Q +. me faisant référence à un poste qui ne répond pas non plus de mes 4 questions n'est pas vraiment utile pour moi ou quelqu'un d'autre
Alors que la première des quatre questions est répondue dans la question indiquée comme duplicata, les trois autres ne le sont pas et ce sont des questions valables. Alors peut-être peut-être supprimer cette première question. Vous avez mon vote pour la réouverture. @TemplaTerex Il n'y a rien à rétrécir dans la troisième et quatrième question, et si vous lisez la seconde comme "la norme permet de" la norme ", il n'y a pas de rétrécissement pour la seconde non plus.
Merci @arnemertz, je comprends déjà tout - la réponse de Dietmarkühl a fait tout ce qui est clair
@Arnemetz La 3ème question a également été répondue dans le Q & A lié. On ne peut s'attendre à poser une question avec un titre qui est clairement en double et prétend que ce n'est pas un duplicata, car 2 sous-requêtes sur 4 sont nouvelles. Affiches (et clairement que l'OP est un utilisateur expérimenté de manière à ce que vous puissiez faire des efforts supplémentaires pour faire des recherches préalables. Si seulement les 2 sous-questionnaires uniques avaient été posées et que les questions et réponses liées ont été mentionnées à l'avance - et pourquoi cela ne fournit pas assez d'informations - alors je n'aurais pas voté à proximité.
Op, je vous suggère de simplifier l'exemple de ne pas contenir d'éléments immatériels pour votre question (comme
struct s code>; qui se soucie de cela, non?).