Warum compiliert das?
-
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