¿Cómo averiguar qué funciones generó el compilador?

11

Sé sobre las funciones generadas por el compilador, la regla de tres y la regla de cinco. En escenarios del mundo real, puede que no sea trivial averiguar exactamente cuáles de las funciones generadas por el compilador (constructores, operadores de asignación, destructor) fueron realmente creadas por el compilador.

¿Hay alguna forma de enumerar las funciones generadas por el compilador para una clase específica?

Estoy principalmente interesado en Visual Studio 2019 y Xcode, pero una solución genérica sería aún más bienvenida.

Helge Klein
fuente

Respuestas:

11

Las reglas son complicadas. Robaré otra respuesta que cita una tabla de la presentación de Howard Hinnant .

ingrese la descripción de la imagen aquí

La moraleja aquí es que una buena práctica es no confiar en las declaraciones implícitas del compilador y declarar explícitamente a cada miembro especial (como predeterminado o eliminado, según sus necesidades)

bolov
fuente
Si declara explícitamente a cada miembro especial, pierde el estado de miembro especial "no declarado" para el constructor de movimientos y el operador de asignación.
Maxim Egorushkin
@MaximEgorushkin, mi punto es declararlos predeterminados si los necesita (aunque el valor predeterminado todavía puede significar no declarado) o eliminarlos si no los quiere.
bolov
2
@bolov La tabla es útil pero esto no responde a mi pregunta. Quiero averiguar qué funciones fueron realmente generadas por el compilador. En otras palabras: no estoy preguntando qué debería suceder en teoría, sino qué está sucediendo en la práctica.
Helge Klein
1
@ tjwrona1992: Según ese argumento, nunca necesitaríamos probar nuestro código, porque sabríamos que si el compilador hizo algo diferente de lo que pretendíamos, entonces debe haber un error.
ruakh
1
@ tjwrona1992: Sí, exactamente. Del mismo modo, el punto de ver lo que ha generado su compilador no es verificar que el compilador sea correcto, sino más bien, verificar que proporcionó al compilador la entrada correcta.
ruakh
7

"¿Hay alguna forma de enumerar las funciones generadas por el compilador para una clase específica?"

Por supuesto que lo hay. En Linux (y otros sistemas Unix) puede usar nm, readelfy objdumpen los archivos / bibliotecas / ejecutables de objetos generados para desmontarlos e inspeccionar los símbolos exportados (y mucho más).

Hay herramientas similares en Windows , lo sé, pero esa no es una plataforma con la que trabajo mucho, así que desafortunadamente no puedo nombrar los nombres exactos de las herramientas allí.

Jesper Juhl
fuente
1
Aunque es muy posible que estas herramientas no le muestren qué funciones podrían haberse generado (es decir, al compilador se le permitió generarlas, pero nunca usó esas funciones, por lo que decidió no molestarse, o la eliminación del código de tiempo de enlace se deshizo de ellas)
JMAA
@JMAA En la mayoría de los casos, "permitir generar pero nunca usar" en términos estándar significaría que una función se "declaró implícitamente" pero no se "definió implícitamente". Sí, esto todavía significa que no verá los símbolos, incluso si la alineación está desactivada.
Aschepler
1
Hablando estrictamente, esta respuesta responde con mayor precisión a la pregunta formulada: "¿Qué métodos generó el compilador?" Eso no es lo mismo que la pregunta mucho menos precisa "¿Qué métodos podría haber generado el compilador en un contexto diferente?"
Rici
@rici True. Pero la pregunta más precisa no es fácil de responder, así que decidí lo que podría responderse. Siéntase libre de votar si cree que mi respuesta no es valiosa.
Jesper Juhl
1
@jesper: no, ya he votado. Creo que la pregunta que respondiste es más precisa, como dije. La otra pregunta, que podría haber sido la intención, requiere un poco de saludo manual porque es contrafactual: no sabemos qué contextos hipotéticos podría incluir. Pero esta es la pregunta que se hace literalmente, intencionalmente o no, así que felicitaciones por responderla.
Rici
1

Actualmente, esta es solo una respuesta parcial.

Visual Studio 2019

Constructores

Al definir un objeto de clase, la función IntelliSense de Visual Studio muestra los constructores disponibles, tanto los generados por el compilador como los suyos:

ingrese la descripción de la imagen aquí

Esta información no siempre aparece, desafortunadamente. Para que funcione para la captura de pantalla anterior, tuve que escribir algo entre paréntesis, de ahí la coma.

Helge Klein
fuente