Puede dejar g++
advertirle sobre este caso de uso con -Winit-self
(en conjunción con -Wuninitialized
), y si usted trata a las advertencias como errores, debe satisfacer su picor.
Esta técnica de usar el constructor de copia para autoiniciar se usa a veces para suprimir la ejecución de un constructor/inicializador predeterminado de un objeto global. Esto puede ser necesario si el constructor predeterminado del objeto global es solo 0
inicializar el objeto, pero el objeto se usó antes de que el constructor se hubiera ejecutado. Como retroceso a C, las variables globales son 0
inicializadas al inicio del programa, y luego el tiempo de ejecución de C++ comienza a ejecutar constructores globales. Para aquellos casos angostos en los que el constructor definido que se habría ejecutado solo fuera a 0
del objeto, la autoinicialización no causa ningún daño.
En el caso general, la autoinicialización del constructor de copias es una mala práctica, ya que generalmente causaría el mismo tipo de problemas que el uso de una variable no inicializada (es decir, un comportamiento indefinido). En el ejemplo particular en la pregunta del OP, i
es local en main
, y por lo tanto no está inicializado. El resultado de leer una variable no inicializada es siempre un comportamiento indefinido.
Para mí no es ilegal, es solo un abuso de notación. –
Se evalúa como (i) 'int i' (ii)' i = i' en ese orden –
Creo que por la misma razón que solo 'int i;' sin asignar 'i' es legal. – asmeurer