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 producefalse
permite todas las excepciones. Una excepción-especificación es nothrow()
si es de la formathrow()
,noexcept
onoexcept( 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.