C++ omitiendo el especificador `noexcept` versus` noexcept(false) `, ¿cuál es su significado preciso?
c++11 (2)
Al especificar noexcept(true) , usted afirma que la función nunca arroja excepciones. Al especificar noexcept(false) , o al no especificar nada, no reclama que la función nunca arroje excepciones.
Entonces, básicamente es su declaración (2), pero tenga en cuenta que para el compilador, eso es equivalente a su declaración (1). Si el compilador no está seguro de que la función no se ejecutará, debe asumir que puede hacerlo.
El bit relevante del estándar es C ++ 11 15.4 / 12:
Una función sin especificación de excepción o con una especificación de excepción de la forma
noexcept( constant-expression )donde la expresión constante producefalsepermite todas las excepciones. Una excepción-especificación es nothrow()si es de la formathrow(),noexceptonoexcept( constant-expression )donde la expresión-constante da como resultadotrue. Una función con una especificación de excepción no lanzable no permite ninguna excepción.
Sólo hay dos desviaciones de esa regla. Uno es destructores: no colocar ninguna especificación de excepción en un destructor le da al destructor la misma especificación de excepción que tendría la generada por defecto. Es decir, noexcept(true) si y solo si todas las funciones que se noexcept(true) directamente desde el destructor generado por defecto son noexcept(true) .
Las otras son funciones de desasignación ( operator delete ): una función de desasignación sin una especificación de excepción explícita se trata como noexcept(true) .
Si marca una función como noexcept(false) , o cualquier otra expresión que se evalúe como falsa, ¿qué significa? (1) ¿Le estoy asegurando al compilador que la función puede lanzar una excepción ?, ¿(2) o no estoy asegurando nada sobre si puede lanzar excepciones o no?
Y, por último, si noexcept especificador noexcept , ¿es equivalente a noexcept(false) , o solo es equivalente al significado (2) nd mencionado anteriormente?
noexcept especificador noexcept es equivalente a noexcept(false) , excepto para los destructores , donde omitir el especificador significa dejar que el compilador deduzca de los miembros y las clases base.