c++ c++11 noexcept

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 produce false permite todas las excepciones. Una excepción-especificación es no throw() si es de la forma throw() , noexcept o noexcept( constant-expression ) donde la expresión-constante da como resultado true . 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.