2012-03-19 11 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; 
} 

Ho una stringa vuota nell'output. Cosa dice lo standard C++ su questo comportamento?invocazione di un costruttore di copia all'interno di un altro costruttore

+3

Auwgh, ho davvero bisogno di un caffè ora. –

+0

Ho ottenuto 'stringa' in uscita con GCC 4.5 – CapelliC

+0

è questo: 'nuovo (questo) A (* questo);' richiama il costruttore di copie all'interno di un altro costruttore? –

risposta

4

Ci devono essere almeno due problemi qui:

  • Si tenta di inizializzare A con una copia di se stesso
  • All'interno del costruttore, A non è ancora completamente costruito, in modo da non si può davvero copiarlo

Per non parlare del fatto che new(this) è di per sé sospetto.

+1

'nuovo (questo)' è ok. E assegnare di solito a qualcosa con una copia di se stesso è anche garantito che funzioni (un operatore di assegnazione copia ha bisogno di proteggersi contro l'autoassegnazione) - la costruzione di copie, d'altra parte, è una questione diversa. –

+0

@Konrad: Quindi il copyctor predefinito (generato) è protetto contro l'autoassegnazione e quindi la copia effettiva non viene eseguita? Sembra che la variabile intermedia A a (* questo); nuova (questo) (a); risolve il "problema"? – user396672

+0

@ user396672 Niente del genere. L'operatore * di assegnazione copie * predefinito protegge dall'autoassegnazione. Non penso che sia il costruttore di copie predefinito, semplicemente perché questo caso normalmente non dovrebbe mai verificarsi. –

0

Si chiama il costruttore s due volte di seguito facendo questo, ergo, il comportamento non è definito (e molto probabilmente una certa perdita di memoria).