es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Declarar un constructor ‘= default’ en un archivo de encabezado rompe el ODR?

Si defino el destructor (o cualquier constructor generado automáticamente) como predeterminado de esta manera:

struct A {
   ~A() = default;
};

Y luego incluyo esto en varias unidades de traducción, ¿esto rompe la ODR? ¿Alguien puede explicarme los pasos en la página de ODR? Porque tengo problemas para entender si el destructor generado por el compilador estará en línea u tendrá algún otro efecto para evitar que se rompa la ODR.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la Regla de Definición Única (ODR, por sus siglas en inglés) en C++, un programa debería tener como máximo una definición de cada función y variable no en línea. Si hay múltiples definiciones de la misma función o variable, el comportamiento es indefinido.

    En el caso de definir el destructor (o cualquier constructor generado automáticamente) como predeterminado, no se romperá la ODR incluso si se incluye en múltiples unidades de traducción. Esto se debe a que definir un destructor como predeterminado es equivalente a definirlo como si el compilador lo hubiera generado. El destructor generado será en línea e idéntico en todas las unidades de traducción, asegurando que no haya violación de la ODR.

    La página de ODR en cppreference.com explica este concepto con más detalle, afirmando que “una función predeterminada se define como si se hubiera definido explícitamente con un cuerpo de función igual a = default” y que “las funciones predeterminadas son implícitamente en línea”.

    En resumen, definir un destructor (o constructor generado automáticamente) como predeterminado no romperá la ODR, ya que la función generada será en línea e idéntica en todas las unidades de traducción.

Comments are closed.