Warum compiliert das?



  • Davon abgesehen gibt er, wenn man das über die Standard-Ausgabe ausgibt (std::cout), auch nichts aus.

    Ist vielleicht ein Compilerfehler (bzw. eine Art Compilerepidemie 😃 ) ?!



  • naja, das liegt daran, dass nicht der definierte konstruktor aufgerufen wird. leerer ctor kanns auch nich sein. copy ctor mit funktionspointer?

    nach was wird std::string aufgelöst? fuscht der da irgendnen cast vor den parameter oder sowas?



  • Kann mir eigentlich nur vorstellen dass sdgonodf ein Compilerinternes Symbol ist, was zu einem der string-Konstruktoren passt... 😮



  • Nein, geht mit allem... Ich bin mir sicher, dass es da eine normale Erklärung gibt, die uns irgendein Profi sagen kann.



  • probier doch mal mit gcc.

    bis jetzt haste ja nur vc 6 / vc 03 / vc 05 compiler benutzt.

    dev++ und codeblocks bringen ja von haus aus keinen eigenen mit.

    bzw rufst du die sache überhaupt auf ? weil wenn nicht hats der compiler wahrscheinlich wegoptimiert...



  • Muss der Compiler vorm Optimieren nicht erst Parsen und Syntax checken?!



  • LordJaxom schrieb:

    Kann mir eigentlich nur vorstellen dass sdgonodf ein Compilerinternes Symbol ist, was zu einem der string-Konstruktoren passt... 😮

    Wie schon gesagt, kannste eingeben was Du willst, geht immer, auch wenn Zahlen mit im Spiel sind (dachte auch erst daran liegt es). Aber Compiler-Variablen beginnen auch eigentlich immer mit mindestens einem Unterstrich.

    DaRpH schrieb:

    dev++ und codeblocks bringen ja von haus aus keinen eigenen mit.

    Stimmt, aber der MinGW sollte das ja eigentlich auch (nicht) packen 😉 .



  • void doSomething()
    {
       foo fx = std::string(sdg);
    }
    

    geht übrigens nicht. Liegt an der Klammer. Der Compiler optimiert nicht bevor er parst und wenn man das ganze aufruft gehts genauso.



  • der scheint das als funktionsprototyp zu interpretieren, eine funktion namens fx, die ein foo-objekt zurückgibt.
    es wird also kein code dafür erzeugt...
    🙂



  • Exakt.
    Beleg:

    MS Visual C++ 2005 schrieb:

    strangetest.cpp(15) : warning C4930: 'foo fx(std::string)': prototyped function not called (was a variable definition intended?)

    Hätte man drauf kommen können 😉



  • Nachzulesen in Scott Meyers Effective STL Item 6:

    "Be alert for C++‘s most vexing parse"



  • Ähm^^...:

    Guckt euch mal den Code an:

    int bla(int(6));
    

    Sollte doch theoretisch das gleiche sein, oder ?



  • Hier scheint der Compiler in der Lage zu sein zu erkennen dass 6 kein Symbol (in diesem Fall Parameter) sein kann. Mit nem Stringliteral in "" funktioniert o.g. Beispiel ja auch und gibt diese Warnung nicht.



  • Jo stimmt zwar...aber probier die Funktion mal zu definieren oder gar auf zurufen... da pfeifste aber außem letzten Loch 😃 ^^.

    Dachte (auch) erst, dass er 6 hier als Default Parameter ansieht, aber wenn man schreibt:

    int bla(int i)
    {
       return (i);
    }
    

    Gibbets den Error gleich gratis 🕶 :

    Compiler-Log (MS Visual C++ 2005) schrieb:

    error C2365: "bla": Erneute Definition; vorherige Definition war "Datenvariable". [...]: Siehe Deklaration von 'bla'

    Auch der Aufruf funktioniert nicht. Naja aber is eigentlich auch rille...so sollte man es ja sowieso nit machen 😉 .



  • Weiss garnicht was Du hast. Funktioniert doch.

    void doSomething() 
    { 
       //const char* sdgonodf = "hallo";
       //foo fx(std::string(sdgonodf)); 
       int bar(int(b));
       std::cout << bar(12) << std::endl;
    }
    
    int bar(int(b))
    {
    	return b;
    }
    

    Mit "6" statt "b" wird es wieder eine Variablendeklaration. Dann ist nach dem was bisher festgestellt wurde klar dass der von Dir gepostete Error kommt.



  • Oha, jo stimmt... 💡 .



  • ich sach ja immer: c++ ist echt beschädigt. aber mir glaubt ja keiner 😞 😉



  • das einzige problem mit c++ ist, dass, wenn man nicht die volle ahnung hat, etwas wie X aussehen, in wirklichkeit aber ein Y sein kann.

    das bringt zum einen die "tolle freiheit", zum anderen aber auch kopfschmerzen 😃



  • LordJaxom schrieb:

    void doSomething() 
    { 
       //const char* sdgonodf = "hallo";
       //foo fx(std::string(sdgonodf)); 
       int bar(int(b));
       std::cout << bar(12) << std::endl;
    }
    
    int bar(int(b))
    {
    	return b;
    }
    

    Genau.
    Und dass die "zusätzlichen" Klammern um den Parameternamen OK sind wird auch schnell klar wenn man sich ansieht dass z.B. für sowas diese Klammern (genau an der Stelle) erforderlich sind:

    void foo(int (&array)[10]);
    

    EDIT: genau solche Verwirrung kann man gut vermeiden wenn man grundsätzlich so initialisiert:

    foo fx = foo(std::string("sdgonodf")); // OK
    foo fx = foo(std::string(sdgonodf)); // Fehler
    

Anmelden zum Antworten