Ich beobachtete merkwürdiges Verhalten in g ++ 4.6.3. Wenn eine temporäre Erstellung von Klasse Konstruktor aufrufen File(arg)
der Compiler wählt die Existenz arg
und analysieren den Ausdruck als File arg;
Aufruf des Konstruktors mit Member als Argument als Variablendefinition
- zu ignorieren Warum wird der Elementname ignoriert?
- Was sagt der Standard?
- Wie vermeidet man das? (Ohne die neue Syntax
{}
) - Gibt es eine Compiler-Warnung? (Ich könnte eine beliebige Zeichenfolge arg verwenden und es wäre ruhig noch arbeiten)
Code:
#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;
}
Ausgang:
$ ???
$ As desired
$ Oops undetected typo
Sie können einen Konstruktor nicht direkt aufrufen, nur wenn Sie ein Objekt erstellen oder die Platzierung neu verwenden. – chris
Wie funktioniert 'fhddfkjdh' überhaupt? Dies ist nirgends definiert und sollte zu einem Kompilierungsfehler führen? – RvdK
@PoweRoy, Es wird behandelt als: 'Datei fdfdsfsda()' – Xyand