Algunos compiladores pueden usar una especificación de no lanzar en una función en línea que solo devuelve una variable miembro y no podría lanzar excepciones para hacer pesimizaciones (una palabra inventada para el opuesto de optimizaciones) que pueden tener un efecto perjudicial en el rendimiento. Esto se describe en la literatura de Boost: especificación de excepción
Con algunos compiladores una especificación de no tirar sobre funciones no en línea puede ser beneficiosa si se realizan las optimizaciones correctas y el uso de esa función impacta el rendimiento de una manera que lo justifique.
Para mí, parece que si usarlo o no es una llamada hecha por un ojo muy crítico como parte de un esfuerzo de optimización del rendimiento, tal vez usando herramientas de creación de perfiles.
Una cita del enlace anterior para aquellos que tienen prisa (contiene un ejemplo de los malos efectos no deseados de especificar throw en una función en línea desde un compilador ingenuo):
Justificación de la excepción-especificación
Las especificaciones de excepción [ISO 15.4] a veces se codifican para indicar qué excepciones se pueden lanzar, o porque el programador espera que mejoren el rendimiento. Pero considere el siguiente miembro de un puntero inteligente:
T & operator * () const throw () {return * ptr; }
Esta función no llama a otras funciones; solo manipula tipos de datos fundamentales como punteros. Por lo tanto, no se puede invocar ningún comportamiento de tiempo de ejecución de la especificación de excepción. La función está completamente expuesta al compilador; de hecho, se declara en línea. Por lo tanto, un compilador inteligente puede deducir fácilmente que las funciones son incapaces de lanzar excepciones, y hacer las mismas optimizaciones que habría hecho basándose en la especificación de excepción vacía. Sin embargo, un compilador "tonto" puede hacer todo tipo de pesimizaciones.
Por ejemplo, algunos compiladores desactivan la alineación si hay una especificación de excepción. Algunos compiladores agregan bloques try / catch. Tales pesimizaciones pueden ser un desastre de rendimiento que hace que el código sea inutilizable en aplicaciones prácticas.
Aunque inicialmente es atractivo, una especificación de excepción tiende a tener consecuencias que requieren un pensamiento muy cuidadoso para entender. El mayor problema con las especificaciones de excepción es que los programadores las usan como si tuvieran el efecto que le gustaría al programador, en lugar del efecto que realmente tienen.
Una función no en línea es el lugar donde una especificación de excepción "no arroja nada" puede tener algún beneficio con algunos compiladores.