¿Por qué se utiliza noexcept dos veces para la función global swap?
Estoy tratando de entender noexcept
. Me di cuenta de que la función de intercambio global generalmente se especifica de esta manera:
void swap (T& x, T& y) noexcept(noexcept(x.swap(y)))
{
x.swap(y);
}
Quiero entender por qué la especificación de noexcept
es noexcept(noexcept(x.swap(y)))
y no noexcept(x.swap(y))
.
davy.ai
La especificación
noexcept
en este fragmento de código utiliza el operador anidadonoexcept
para evitar que cualquier excepción potencial que pueda surgir en la llamada a la funciónx.swap(y)
se propague fuera de la funciónswap
.Al especificar
noexcept (noexcept(x.swap(y)))
, la funciónswap
se marca como noexcept solo six.swap(y)
esnoexcept
. Este enfoque asegura que la funciónswap
no lanzará una excepción, independientemente de six.swap(y)
puede lanzar una excepción o no.Por otro lado, si la especificación
nolexcept
se escribiera simplemente comonoexcept(x.swap(y))
, cualquier excepción lanzada porx.swap(y)
se propagaría fuera de la funciónswap
y violaría el contrato deswap
, que establece que la función no debe lanzar excepciones.Por lo tanto, en este caso se utiliza el operador anidado
noexcept
para asegurar que la funciónswap
esté correctamente marcada comonoexcept
y también evitar que las excepciones se propaguen fuera de la función.