Warum meckert mein Compil0r nicht?



  • Hi!

    vector <string> v;
    const vector <string>& get_vector()
    {
    	v.push_back("test");
    	return v;
    }
    
    void use_vector()
    {
    	const vector <string>& a = get_vector();
    	vector <string> b = get_vector();
    }
    

    Warum wird Zeile 11 nicht angemeckert? Die Funktion get_vector
    liefert doch ne const-Referenz, aber Zeile 11 nimmt keine Referenz entgegen sondern kopiert das Objekt. 😕



  • Ähm, weil in Zwile 11 keine Referenz zugewiesen sondern der Zuweisungsoperator augerufen wird. Und dieser ist ja bekanntermaßen mit ner constreferenz zufrieden.



  • Ja, warum solltest du es nicht kopieren dürfen? Der konstante vector wird dabei ja nicht verändert.



  • vect0r0r schrieb:

    Ähm, weil in Zwile 11 [...] der Zuweisungsoperator augerufen wird.

    Falsch. Setzen. 6.



  • Ok!



  • Achso, warum, ja weil ich dachte: das was als Type aus einer Funktion rauskommt, muss auch entgegen genommen werden. Aber wenn ich schon denke 😃


  • Administrator

    vect0r schrieb:

    Achso, warum, ja weil ich dachte: das was als Type aus einer Funktion rauskommt, muss auch entgegen genommen werden. Aber wenn ich schon denke 😃

    Es wird nicht der Zuweisungsoperator aufgerufen sondern der Kopierkonstruktor.

    Grüssli 😉



  • Dravere schrieb:

    ...
    Es wird nicht der Zuweisungsoperator aufgerufen sondern der Kopierkonstruktor.

    Grüssli 😉

    Naja - die Kernaussage ist aber schon korrekt, dass die entgegennehmende "Funktion" (sei es nun operator=(), CopyCtor oder irgendetwas Anderes) das Objekt als "unveränderbar" (const-Ref., Kopie, ...)) entgegennimmt - und da der Compiler nichts gegen haben wird.

    Wobei es doch eigentlich Probleme geben sollte, wenn der Kopierkonstruktor (was Gott verhindern möge) den übergebenen Parameter veränderte, oder?
    std::vector ist natürlich nicht so "kaputt" definiert, aber Folgendes wäre ja schon denkbar:

    struct B {
       B(vector<string>& v);
    }
    
    B b = get_vector();
    

    ... und da sollte der Compiler wohl doch was gegen haben, oder?

    Gruß,

    Simon2.


Anmelden zum Antworten