Warum compiliert das?
-
Hi.
Kann mir einer sagen warum folgende Zeile compiliert (mit VC++ 2003 und VC+ 2005)
class foo { std::string m_s; public: foo(const std::string& r) { m_s = r; } }; void doSomething() { foo fx(std::string(sdgonodf)); }Da fehlen die " beim std::string in doSomething. Wird aber trozdem ohne zu mekern geschluckt. Jemand ne idee was da genau passiert

-
kenn vc++ nich, aber vielleicht interpretiert der einfach alle literale, die er nicht zuordnen kann, als string. macht z.b. der interpreter php auch.
-
Oh Wot
... Habs grad auch mal mit Microsoft Visual C++ 6.0/2005 Express Edition, Code::Blocks und Dev C++ getestet, da compiliert er das auch tadellos
.
-
thordk schrieb:
kenn vc++ nich, aber vielleicht interpretiert der einfach alle literale, die er nicht zuordnen kann, als string. macht z.b. der interpreter php auch.
macht er defintiv nicht
klapt nur in dem speziellen fall. Ein std::string s = bla; geht nicht.
-
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
