Kriege "basic_string::_S_create" ausgegeben?



  • Folgender (absolut sinnloser) Code

    #include <iostream>
    #include <algorithm>
    
    std::string zu_string(int x)
    {
        std::string fertig;
        do
            fertig.push_back(x % 10 + '0');
        while(x /= 10);
        std::reverse(fertig.begin(), fertig.end());
        return fertig;
    }
    
    std::string operator+(const std::string& b, int a)
    {
        return (b + zu_string(a));
    }
    
    int main()
    {
        std::string x = "123" + 4;
        std::cout << x;
    }
    

    Erzeugt folgende Ausgabe:

    Konsole schrieb:

    basic_string::_S_create

    Das er aus dem Literal "123" nen string macht, ist mir schon klar, es gibt ja nur ne Defintion mit nem string als Parameter. Warum gibt er mir das aber aus? Und auch wenn er das Bedürfnis hat, mir das unbedingt mitzuteilen, warum find ich im Inhalt nirgends etwas wie "1234"?

    Mit

    std::string x = std::string("123") + 4;
    

    geht's.

    Achja, ich hab das ganze eben auf ideone.com getestet:

    http://ideone.com/iTM74

    Da ist die Ausgabe lustigerweise

    Ideone.com schrieb:

    ;(

    was mir sagt, dass ich was falsch verstanden hab. Und was?



  • Incocnito schrieb:

    Das er aus dem Literal "123" nen string macht, ist mir schon klar, es gibt ja nur ne Defintion mit nem string als Parameter.

    Denkfehler. Das Literal "123" ist zunächst mal ein const char -Array mit 4 Elementen, und "123"+4 ist demzufolge ein Zeiger auf die Position nach diesem Array. Da fängt halt zufälligerweise der String "basic_string::_S_create" an. Das ist aber undefiniert.


  • Mod

    "123" + 4 ist irgendwelcher Mist der zufällig im Speicher hinter dem Literal "123" steht. Denn "123" in diesem Kontext zerfällt zu einem Zeiger auf die '1'.

    edit: Zu langsam.



  • 😃
    Oh mann. Darauf muss man aber auch erstmal kommen, wenn man vorher extra nen Operator zu rumspielen definiert.
    Danke.


Anmelden zum Antworten