2012-10-15 3 views
6

Ho osservato un comportamento particolare in g ++ 4.6.3. Quando si crea una temporanea chiamando costruttore della classe File(arg) il compilatore sceglie di ignorare l'esistenza di arg e analizzare l'espressione come File arg;Chiamare il costruttore con membro come argomento analizzato come definizione di variabile

  • Perché il nome del membro ignorato?
  • Cosa dice lo standard?
  • Come evitarlo? (Senza utilizzare la nuova sintassi {})
  • C'è un avviso relativo al compilatore? (Ho potuto utilizzare un ARG stringa arbitraria e sarebbe ancora lavorare tranquillamente)

Codice:

#include <iostream> 

class File { 
public: 
    explicit File(int val) : m_val(val) { std::cout<<"As desired"<< std::endl; } 
    File() : m_val(10) { std::cout<< "???"<< std::endl;} 

private: 
    int m_val; 
}; 

class Test { 
public: 
    void RunTest1() { File(m_test_val); } 
    void RunTest2() { File(this->m_test_val); } 
    void RunTest3() { File(fhddfkjdh); std::cout<< "Oops undetected typo"<< std::endl; } 
private: 
    int m_test_val; 
}; 

int main() 
{ 
    Test t; 
    t.RunTest1(); 
    t.RunTest2(); 
    t.RunTest3(); 
    return 0; 
} 

uscita:

$ ??? 
$ As desired 
$ Oops undetected typo 
+0

Non è possibile chiamare direttamente un costruttore, solo quando si crea un oggetto o si utilizza il posizionamento nuovo. – chris

+0

Come funziona 'fhddfkjdh'? Questo non è definito da nessuna parte e dovrebbe comportare un errore di compilazione? – RvdK

+0

@PoweRoy, viene trattato come: 'File fdfdsfsda()' – Xyand

risposta

2

Il compilatore considera la linea:

File(m_test_val); 

come

File m_test_val; 

così si sta effettivamente creando un oggetto denominato chiamato m_test_val utilizzando il costruttore predefinito. Lo stesso vale per File(fhddfkjdh).

La soluzione è - questo indica al compilatore che si desidera utilizzare il membro per creare creare un oggetto denominato. Un altro sarebbe nominare l'oggetto - File x(m_test_val).

+2

Un'altra soluzione è utilizzare la sintassi di inizializzazione uniforme: 'File {m_test_val}'. – Mankarse

+0

@Mankarse dalla domanda: "Senza usare la nuova sintassi {}" –

+0

hahaha * facepalm * – Mankarse