Une spécification de non-projection sur une fonction en ligne qui ne renvoie qu'une variable membre et qui ne pourrait pas lever des exceptions peut être utilisée par certains compilateurs pour effectuer des pessimisations (un mot inventé pour l'opposé des optimisations) qui peuvent avoir un effet néfaste sur les performances. Ceci est décrit dans la littérature Boost: Spécification d'exception
Avec certains compilateurs, une spécification de non-projection sur les fonctions non en ligne peut être bénéfique si les optimisations correctes sont faites et que l'utilisation de cette fonction a un impact sur les performances d'une manière qui la justifie.
Pour moi, il semble que l'utilisation ou non soit un appel lancé par un œil très critique dans le cadre d'un effort d'optimisation des performances, peut-être à l'aide d'outils de profilage.
Une citation du lien ci-dessus pour ceux qui sont pressés (contient un exemple de mauvais effets involontaires de spécification de lancer sur une fonction en ligne à partir d'un compilateur naïf):
Justification de la spécification d'exception
Les spécifications d'exception [ISO 15.4] sont parfois codées pour indiquer quelles exceptions peuvent être levées, ou parce que le programmeur espère qu'elles amélioreront les performances. Mais considérons le membre suivant à partir d'un pointeur intelligent:
T & operator * () const throw () {return * ptr; }
Cette fonction n'appelle aucune autre fonction; il ne manipule que les types de données fondamentaux comme les pointeurs. Par conséquent, aucun comportement d'exécution de la spécification d'exception ne peut être invoqué. La fonction est complètement exposée au compilateur; en effet, il est déclaré en ligne. Par conséquent, un compilateur intelligent peut facilement déduire que les fonctions sont incapables de lever des exceptions, et faire les mêmes optimisations qu'il aurait faites sur la base de la spécification d'exception vide. Un compilateur "stupide", cependant, peut faire toutes sortes de pessimisations.
Par exemple, certains compilateurs désactivent l'inline s'il existe une spécification d'exception. Certains compilateurs ajoutent des blocs try / catch. De telles pessimisations peuvent être un désastre de performance qui rend le code inutilisable dans les applications pratiques.
Bien qu'initialement attrayante, une spécification d'exception a tendance à avoir des conséquences qui nécessitent une réflexion très approfondie pour être comprises. Le plus gros problème avec les spécifications d'exception est que les programmeurs les utilisent comme s'ils avaient l'effet souhaité par le programmeur, au lieu de l'effet qu'ils ont réellement.
Une fonction non en ligne est le seul endroit où une spécification d'exception «ne lance rien» peut avoir certains avantages avec certains compilateurs.