2012-03-19 17 views
8
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
class A 
{ 
public: 
    std::string s; 
    A() 
    { 
     s = "string"; 
     new(this)A(*this); 
    } 
}; 
int main() 
{ 
    A a; 
    std::cout<<a.s; 
    return 0; 
} 

Aparece una cadena vacía en la salida. ¿Qué dice el estándar de C++ sobre tal comportamiento?invocando el constructor de copia dentro de otro constructor

+3

Auwgh, realmente necesito un café ahora. –

+0

Tengo 'cadena' en la salida con GCC 4.5 – CapelliC

+0

es esto: 'nuevo (esto) A (* this);' invocando el constructor de copia dentro de otro constructor? –

Respuesta

4

Debe haber al menos dos problemas:

  • Intenta inicializar A con una copia de sí mismo
  • dentro del constructor, A todavía no está totalmente construido, por lo que realmente no se puede copiar

Sin mencionar que new(this) es sospechoso en sí mismo.

+1

'new (this)' está bien. Y la asignación a algo con una copia de sí mismo generalmente también está garantizada para funcionar (un operador de asignación de copias debe protegerse contra la autoasignación) - la construcción de copias, por otro lado, es una cuestión diferente. –

+0

@Konrad: ¿Entonces el copiador predeterminado (generado) está protegido contra la autoasignación y, por lo tanto, no se realiza la copia real? Parece que la variable intermedia A a (* this); nuevo (esto) (a); resuelve el "problema"? – user396672

+0

@ user396672 Nada por el estilo. El operador predeterminado * de asignación de copias * protege contra la autoasignación. No creo que el constructor de copia predeterminado lo haga, simplemente porque este caso normalmente nunca debería ocurrir. –

0

Está llamando al constructor s dos veces seguidas al hacer esto, ergo, el comportamiento no está definido (y es probable que se haya filtrado algo de memoria).

Cuestiones relacionadas