2010-12-13 22 views
5
class Foo 
{ 
friend class SquirrelVM; 
public: 
Foo() { cout << "Ctor" << endl; } 
virtual ~Foo() { cout << "Dtor" << endl; } 
Foo(const Foo & o) { cout << "const Ctor" << endl; } 

template <typename _ty> 
Foo(const _ty & val) { cout << "T const Ref" << endl; } 
template <typename _ty> 
Foo(_ty & val) { cout << "T Ref" << endl; } 
template <typename _ty> 
Foo(_ty * val) { cout << "T Ptr" << endl; } 
}; 

Foo CreateFoo() 
{ 
Foo ret; 
return ret; 
} 

int main(int argc, char* argv[]) 
{ 
Foo f = CreateFoo(); 
return 0; 
} 

uscite sono diverse tra VS2005 e VS 2010. Risultati attesi sono come questo ..della funzione modello è diverso tra il VS2005 e VS2010

Ctor 
const Ctor 
Dtor 
Dtor 

uscite sopra descritti provengano se io costruisco in VS2005.

Ma, l'uscita di VS2010 non è lo stesso con la priorità

Ctor 
T Ref 
Dtor 
Dtor 

Perché modello della funzione di VS2005 è superiore al normale funzione in VS2010?


[modifica] Se const viene omesso il costruttore di copia, di uscita (che è lo stesso con VS2005) prevede esce. C'è qualche effetto collaterale se la forma del costruttore di copia non è uguale alla forma raccomandata? modulo raccomandato .. voglio dire ... Foo(const Foo&); non Foo(Foo&);

risposta

6

Foo(_ty & val) con _ty essendo Foo è una migliore corrispondenza perché avrà tipo di parametro Foo& allineamento ad un non-const Foo lvalue, mentre l'altro ha una const che renderà più un match un po 'peggiore.

C'è stata una certa confusione durante il processo di creazione di C++ 0x e prima se i modelli possono essere utilizzati per copiare un oggetto di una classe sul proprio tipo di classe. Il comitato ha recentemente pensato che lo hanno want to stop the confusion e permetta una cosa del genere. VS2010 sembra riflettere questa decisione.

+0

Grazie per il vostro aiuto. Quindi, come risolvere questo problema? – codevania

+0

Per favore controlla di nuovo la mia domanda. Ho fatto modifica. – codevania

+0

@codevania: è necessario utilizzare i riferimenti rvalue in VS2010 e implementare un costruttore di spostamenti. – Puppy

Problemi correlati