2012-10-15 13 views
6

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 
+0

Sie können einen Konstruktor nicht direkt aufrufen, nur wenn Sie ein Objekt erstellen oder die Platzierung neu verwenden. – chris

+0

Wie funktioniert 'fhddfkjdh' überhaupt? Dies ist nirgends definiert und sollte zu einem Kompilierungsfehler führen? – RvdK

+0

@PoweRoy, Es wird behandelt als: 'Datei fdfdsfsda()' – Xyand

Antwort

2

Der Compiler die Zeile behandelt:

File(m_test_val); 

als

File m_test_val; 

so erstellen Sie tatsächlich ein benanntes Objekt namens m_test_val mit dem Standardkonstruktor. Gleiches gilt für File(fhddfkjdh).

Die Lösung ist - dies teilt dem Compiler mit, dass Sie das Element zum Erstellen eines benannten Objekts verwenden möchten. Eine andere wäre, das Objekt zu benennen - File x(m_test_val).

+2

Eine andere Lösung besteht darin, eine einheitliche Initialisierungssyntax zu verwenden: 'File {m_test_val}'. – Mankarse

+0

@Mankarse aus der Frage - "Ohne neue {} Syntax zu verwenden" –

+0

hahaha * facepalm * – Mankarse

Verwandte Themen