Wieso kann man in C++ keine Strings mit Ints verknüpfen?



  • Ja, das habe ich übersehen. Schön ist das wirklich nicht, aber dafür hat man paar andere Vorteile.



  • [Naja . war bestimmt sowieso nur Trollerei ... aber da will ich mal nicht so sein, weil ich gerade gute Laune habe.]

    Es nervt! schrieb:

    ...
    Warum geht das nicht? ...

    Vielleicht, weil ein int eben kein string ist ?
    Ich bin ehrlich gesagt sehr froh, dass in C++ ein string ein string, ein int ein int und ein stream ein stream ist. Alles andere macht einen nämlich ganz schnell wahnsinnig (natürlich nicht, wenn man sowieso nur 20-Zeilen-Clickibunti-Programe schreibt)
    ...und erst Recht bin ich froh, dass weder string noch int eine Sonderrolle haben, sondern sich eben genauso verhalten wie andere Typen.

    BTW: Geht das

    str += val;
    

    in Java wirklich ? Würde mich doch mangels "überladbarer" operatoren sehr wundern.

    Gruß,

    Simon2.



  • Du hast Recht. Für Gleichberechtigung unter den Datentypen! 😃

    Gehört in Java ein String nicht zu den Grunddatentypen, für die überladene Operatoren bereits bestehen?



  • Badestrand schrieb:

    void foo( std::stringstream& s );
    
    std::stringstream a("Hallo"), b("Welt");
    foo( a.str() + b.str() );
    

    Das Argument von foo muss noch const sein[/quote]

    wieso sollte es das müssen?



  • falsch schrieb:

    Badestrand schrieb:

    void foo( std::stringstream& s );
    

    Das Argument von foo muss noch const sein

    wieso sollte es das müssen?

    Weil du sonst eine non-const-Referenz auf ein temporäres Objekt hättest, temporäre Objekte sind aber quasi nur zum Lesen und nicht zum Schreiben da..
    ➡

    void foo1( const int& a );
    void foo2( int& a );
    
    void kraks()
    {
        foo1( 10 ); // Geht
        foo2( 10 ); // Geht nicht
    }
    


  • Nexus schrieb:

    ...Gehört in Java ein String nicht zu den Grunddatentypen, ...

    Eben: Igittibäh !!
    Spätestens, weil das mit "myInt" oder "myString" schon nicht mehr geht und auch nicht "gehbar gemacht" werden kann. 😃

    Gruß,

    Simon2.



  • also bei mir geht beides 😮 (visual c++)



  • falsch schrieb:

    also bei mir geht beides 😮 (visual c++)

    Das ist bedenklich.. Welche Version? Und was passiert, wenn du in foo2 einen Wert zuweist?



  • Jetzt bin ich verwirrt:

    void foo2( int& a )
    {
    	std::cout << a << std::endl;
    }
    
    void foo3( std::string& s)
    {
    	std::cout << s << std::endl;
    }
    
    int main()
    {
        foo2(10); // geht nicht
        foo3(std::string("temp")); // geht
        return 0;
    }
    

    Ich sehe da nicht so den massiven Unterschied...



  • Beim Aufruf von foo3 wird ein temporäres std::string-Objekt vor dem Aufruf erzeugt; näheres kann dir jetzt auch nur noch camper oder irgendwer anderes Standard-vertrautes sagen..



  • Aber dann binde ich ja trotzdem ein temporäres Objekt an eine non-const referenz!



  • Ersteres ist illegal weil 10 vom Typ const int ist, letzteres ist AFAIK „nur“ undefiniertes Verhalten.



  • falsch schrieb:

    Aber dann binde ich ja trotzdem ein temporäres Objekt an eine non-const referenz!

    Es ist aber immerhin nicht so temporär wie eins, das extra für den Aufruf erstellt wird 😃 Naja, ich weiß nicht, vielleicht weil das string-Objekt explizit erzeugt wird? Wie gesagt, hier bin ich mit meinem Latein am Ende...


  • Mod

    Beide Funktionsaufrufe sind ill-formed, falls der Compiler das anders sieht, erlaubt das nur Rückschlüsse bezüglich dessen Standardkonformität. Was geht bzw. geht-nicht bedeuten soll, weis ich nicht. "Temporär" kann man nicht steigern :p



  • geht bedeutet, dass es der compiler übersetzt.
    geht nicht bedeutet, dass der compiler an dieser zeile stehen bleibt und den fehler bemängelt.

    dann haben wir also offiziell nicht-standardkonformes verhalten in visual c++ 2005 ausgemacht?



  • Bashar schrieb:

    groovemaster schrieb:

    Bashar schrieb:

    groovemaster schrieb:

    '~' ist immerhin auch der Operator für bitweise Negierung.

    Nein, das ist der unäre Operator.

    Und nachts ist es kälter als draussen. 🙂 Ob unär oder nicht ist bezugslos zu meiner Aussage. '~' ist und bleibt ein Operator.

    Aber du hast schon verstanden, was ich ausdrücken will?

    Klar. Nur ging es mir ja um einen separaten Operator, der bisher noch nicht verwendet wird. Ob unär, binär oder ternär spielt dabei keine Rolle. Daher war dein Kommentar etwas unpassend. Oder glaubst du, mir ist nicht bewusst, dass '~' für binäre Verknüpfungen noch nicht verwendet wird?



  • groovemaster schrieb:

    Bashar schrieb:

    Aber du hast schon verstanden, was ich ausdrücken will?

    Klar. Nur ging es mir ja um einen separaten Operator, der bisher noch nicht verwendet wird.

    Das stört bei anderen Operatoren (wie * und &) doch auch keinen, also muss die Frage erlaubt sein, warum du diese Analogie ignorierst.



  • falsch schrieb:

    Jetzt bin ich verwirrt:

    void foo2( int& a )
    {
    	std::cout << a << std::endl;
    }
    
    void foo3( std::string& s)
    {
    	std::cout << s << std::endl;
    }
    
    int main()
    {
        foo2(10); // geht nicht
        foo3(std::string("temp")); // geht
        return 0;
    }
    

    Ich sehe da nicht so den massiven Unterschied...

    FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39474.html



  • Sorry, habe alle Antworten vorher nicht gesehen!!!

    weil beim std::string der += operator für den Typ int nicht implementiert ist.
    Das kannst du aber selber machen oder die eine eigene String Klasse schreiben,
    die das macht. In anderen Sprachen haben sich eben die Entwickler die Mühe gemacht,für solche Probleme eine Funktion oder eben einen operator zu schreiben.
    Man sollte deshalb aber nicht über C++ meckern.
    Sorry, habe alle Antworten vorher nicht gesehen!!!



  • falsch schrieb:

    geht bedeutet, dass es der compiler übersetzt.
    geht nicht bedeutet, dass der compiler an dieser zeile stehen bleibt und den fehler bemängelt.

    dann haben wir also offiziell nicht-standardkonformes verhalten in visual c++ 2005 ausgemacht?

    Schmeißt er wenigstens ne Warnung raus? Kann man ihn vielleicht in einen megakonformen Modus schalten in dem er sowas ablehnt?


Anmelden zum Antworten