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
Non è possibile chiamare direttamente un costruttore, solo quando si crea un oggetto o si utilizza il posizionamento nuovo. – chris
Come funziona 'fhddfkjdh'? Questo non è definito da nessuna parte e dovrebbe comportare un errore di compilazione? – RvdK
@PoweRoy, viene trattato come: 'File fdfdsfsda()' – Xyand