Recientemente comencé a agregar la nueva especificación noexcept
para mover constructores/asignaciones siempre que sea posible. Ahora comencé a preguntarme cómo es la especificación de excepción de las funciones miembro generadas implícitamente. Dado que tener noexcept
mover funciones permite el uso de rutas de código más eficientes (por ejemplo, al cambiar el tamaño de un vector
), espero que se declaren como noexcept siempre que sea posible. Tenía problemas para entender lo que el estándar tiene que decir al respecto y por lo tanto probado el siguiente código en g ++ 4.6 (con -std=c++0x
) para conseguir un poco de control sobre ella:miembros generados implícitos y noexcept
struct foobar{};
int main()
{
foobar a, b;
std::cout<<std::boolalpha
<<noexcept(foobar())<<", "<<noexcept(foobar(a))<<", "
<<noexcept(a = b) <<", "<<noexcept(a = std::move(b))<<", "
<<noexcept(foobar(std::move(a)))<<std::endl;
}
Esto me dio una potencia de True, True, True, False, False
, lo que significa ese valor predeterminado y copiar el constructor/asignación donde noexcept
, mientras que la operación de mover donde no.
Ahora mi pregunta: ¿
¿En qué circunstancias se generan implícita (o default) funciones miembro declarados como noexcept
? Además, ¿es correcto el comportamiento observado para foobar
o simplemente un error del compilador en gcc4.6?
¿Significa eso que esas funciones son 'noexcept' siempre que sea posible (es decir, que no llaman a ninguna función de lanzamiento)? – Grizzly
@Grizzly: Sí. – kennytm
@Grizzly: Creo que significa que serán 'noexcept' si solo llaman a las funciones' noexcept' (es decir, si las funciones reales llamadas throw o not son irrelevantes, la especificación de excepción es lo que importa) –