0Pricing
C++ Academy · Lección

Especificador noexcept

Marque las funciones que no lanzan excepciones

Especificador noexcept es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Qué declara noexcept

El especificador noexcept promete que una función no lanzará excepciones. Si aun así lo hace, el programa llama a std::terminate.

#include <iostream>

int square(int x) noexcept {
    return x * x;
}

int main() {
    std::cout << square(5) << "\n";
}

Por qué es importante

Saber que una función no puede lanzar excepciones permite al compilador y a la biblioteca optimizar; por ejemplo, elegir movimientos en lugar de copias al ampliar un contenedor.

Las operaciones de movimiento deberían ser noexcept

std::vector solo utiliza su constructor de movimiento al realojar elementos si es noexcept; de lo contrario, copia por seguridad. Por eso, marque los movimientos como noexcept.

struct Buffer {
    int* p;
    Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};

Los destructores son noexcept de forma predeterminada

Desde C++11, los destructores son implícitamente noexcept. Permitir que una excepción escape de uno termina el programa.

noexcept condicional

noexcept(expr) hace que la promesa dependa de un booleano evaluado en tiempo de compilación, lo que resulta útil en plantillas que reenvían la garantía de otro tipo.

template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

Consultar con el operador noexcept

Como operador, noexcept(expr) devuelve true si se ha declarado que la expresión no lanza excepciones; resulta práctico en plantillas.

#include <iostream>

int f() noexcept { return 1; }
int g() { return 2; }

int main() {
    std::cout << noexcept(f()) << " " << noexcept(g()) << "\n";  // 1 0
}

noexcept forma parte del tipo

Desde C++17, noexcept forma parte del tipo de un puntero a función, por lo que una función que puede lanzar excepciones no puede vincularse a un puntero noexcept.

No prometa más de lo que puede cumplir

Marque una función como noexcept únicamente si está seguro de que no puede lanzar excepciones. Una promesa falsa que se incumpla bloquea todo el programa.

Buenos candidatos

Las operaciones de intercambio, los movimientos, los destructores, los getters sencillos y los auxiliares aritméticos son candidatos naturales para ser funciones noexcept.

noexcept frente a throw()

La antigua especificación dinámica throw() está obsoleta y se ha eliminado. En el C++ moderno, use noexcept en su lugar.

Rendimiento y seguridad

noexcept documenta la intención y permite optimizaciones como mover elementos durante el realojamiento: una pequeña anotación con un impacto real.

Comprobación rápida

Compruebe su comprensión de noexcept.

Resumen

Ha aprendido que el especificador noexcept promete que no habrá excepciones y permite optimizaciones como mover elementos durante el realojamiento. Marque los movimientos, las operaciones de intercambio y los destructores como noexcept, use formas condicionales en las plantillas y nunca prometa más de lo que pueda cumplir.

Preguntas frecuentes

¿La lección «Especificador noexcept» es gratis?

Sí — el texto completo de «Especificador noexcept» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Especificador noexcept»?

Marque las funciones que no lanzan excepciones Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Especificador noexcept»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. try, catch, throw
  2. Seguridad frente a excepciones
  3. Especificador noexcept
  4. Tipos de excepciones personalizados
← Volver a C++ Academy