2010-02-24 17 views
5

lectura this artículo de Wikipedia señalado por uno de los respondedores a la siguiente pregunta:¿La "optimización del valor de retorno" causa un comportamiento indefinido?

C++ Copy constructor, temporaries and copy semantics

me encontré con esta línea

Dependiendo del compilador, y la configuración del compilador, el programa resultante puede mostrar cualquiera de las siguientes salidas:

¿Esto no califica para un comportamiento indefinido? Sé que el artículo dice Depending on the compiler and settings, pero solo quiero aclarar esto.

+3

Hay una implementación definida, en la cual el implementador del compilador debe documentar el comportamiento, luego aquí no se especifica, lo que significa que el compilador puede hacer lo que quiera siempre que el "comportamiento observable" permanezca igual. Luego hay un comportamiento indefinido, lo que significa que ha ingresado un estado en el programa donde su ejecución ya no está definida. RVO es un caso donde el comportamiento observable puede cambiar. – GManNickG

Respuesta

12

No, no es un comportamiento indefinido. El comportamiento indefinido tiene una definición específica en el estándar (principalmente: "comportamiento, como el que puede surgir al usar una construcción de programa errónea o datos erróneos, para los cuales este Estándar Internacional no impone requisitos"). En este caso, el comportamiento no está especificado, pero no indefinido

La diferencia es que cualquier ejecución de cualquier cosa con comportamiento indefinido hace que todo el comportamiento de su programa no esté definido (es decir, cualquier cosa puede suceder). Con este comportamiento particular no especificado, solo puede suceder una de dos cosas: el constructor de copia se ejecuta o no.

+0

Recuerdo que estaba bastante confundido cuando comencé entre: indefinido, no especificado y definido por la implementación. Muy buena y concisa explicación. –

2

No. El comportamiento se define como una de las salidas en la lista. El comportamiento indefinido incluye demonios que salen volando de tu nariz.

Ver: Nasal Demons

1

undefined behavior es bastante diferente de implementation defined behavior, que es lo que está en juego aquí.

+4

En realidad, no está definido en la implementación, lo que requeriría la implementación para documentar lo que sucede, que no es necesario en este caso. –

0

Depende de lo que quiere decir indefinido. Creo lo que otros han dicho aquí, según la definición que usan los documentos de estándares. Pero también sé que cuando alguien dice "o esto o lo otro, no te digo cuál", pienso que es un comportamiento indefinido.

No es un gran problema, sin embargo, ya que nunca debería causar un error. Cuando define ciertos métodos, se espera que los defina siguiendo convenciones particulares: es un tipo de contrato implícito entre usted, el compilador y las personas que usarán y mantendrán su código.

En este caso, si obtiene una copia de construcción, etc. o el comportamiento optimizado, se espera que el efecto sea el mismo: la persona que llama recibe el valor deseado. Si el constructor de su copia está imprimiendo "Hello World!" o tiene otros efectos secundarios inapropiados, no está implementando el comportamiento esperado para un constructor, por lo que la falla es suya por romper el contrato.

+0

+1 para decir sobre los _side effects_ que podrían no ejecutarse silenciosamente debido a esta optimización :) Si es una declaración de impresión que estás esperando ansiosamente en el terminal, puedes verla; mientras que algo más silencioso, por ejemplo, pasar un mensaje a otro objeto cuando ocurre la construcción, no ocurrirá y será difícil de atrapar. – legends2k

+0

Entonces, ¿puedo inferir de esto que, independientemente del tipo de constructor (ya sea por defecto, copia, etc.), no debería hacer nada más específico que inicializar los miembros? – legends2k

+0

@ legends2k: Sí. El estándar permite que las llamadas al constructor de copias se eliminen al regresar de las funciones, lo que significa que su código no debería tratar de depender de los efectos colaterales en los constructores de copias. – UncleBens

Cuestiones relacionadas