gcc: Pass by reference frage



  • Ich hab folgende Signatur in einer Klasse:

    void foo(MeinTyp & t);
    

    Irgendwo im Code rufe ich diese Methode wie folgt auf:

    {
       // MeinTyp ctor
      foo(MeinTyp("das ist mein typ");
    }
    

    Unter Windows wirds mit VC 2003 und 2005 kompiliert.
    Gcc unter Linux meckert mir an, dass er diese Methode void foo(MeinTyp t) nicht kennt und am ehesten auf void foo(MeinTyp &t) zutrifft.

    Schreibe ich nun folgendes:

    {
       // MeinTyp ctor
      MeinTyp t ("das ist mein typ");
      foo(t);
    }
    

    So schlucksts gcc brav.
    Verstehe ich das richtig, dass GCC referenzen von temporären objekten nicht annimmt? Oder ist das gar undefiniertes verhalten seitens Visual C++, dass er das so kompiliert?
    Ich mein die temporäre Variable existiert doch während des Scopes der foo-Methode, oder nicht?



  • Seikilos schrieb:

    Ich mein die temporäre Variable existiert doch während des Scopes der foo-Methode, oder nicht?

    Das schon, aber wenn man eine Referenz übergibt geht man meistens davon aus, dass man diese später noch mal verwenden will (hier wird das Objekt ja schon zerstört, wenn das Programm aus foo zurückkommt). Schon mal const MeinTyp &t als Parameter versucht? (Kanns jetzt nicht testen, hab grad keinen g++ da).



  • Kann ich leider nicht testen, dafür müsste ich ne menge anderer sachen umschreiben, an vielen stellen fehlt hier die const correctness (ist ein älteres progrämmchen)

    Davon gelesen hab ich auch schon


  • Mod

    Das Problem ist, dass der Compiler bei

    void foo(MeinTyp & t);
    

    davon ausgeht, dass t durch foo geändert werden soll. Sonst hättest du ja

    void foo(const MeinTyp & t);
    

    geschrieben.

    Bei der Übergabe mit

    {
       // MeinTyp ctor
      foo(MeinTyp("das ist mein typ");
    }
    

    ist MeinTyp("das ist mein typ") eine Konstante und kann nicht geändert werden. Bei

    {
       // MeinTyp ctor
      MeinTyp t ("das ist mein typ");
      foo(t);
    }
    

    ist t eine Variable und somit ein gültiger Parameter für foo().


Anmelden zum Antworten