Was benutzen bei der Übergabe?



  • Hi ihr!

    Wollte mal so fragen was man bei einer Funktion für eine Übergabevariante bevorzugen sollte, bzw. wo der unterschied ist?

    void foobar (const std::string& wert)
    ...
    

    oder

    void foobar (const std::string const& wert)
    ...
    

    oder

    void foobar (std::string const& wert)
    ...
    


  • lezten



  • Erste und dritte Variante sind äquivalent, ich persönlich bevorzuge Nummer 3. Denn const bezieht sich immer auf das was links davon steht (also das std::string ), es sei denn, es steht selbst ganz links, wie in Variante 1. So gesehen ist Variante 3 also einheitlicher, insbesondere wenn man irgendwann Typen benutzt, wo mehrmals const vorkommt.

    Deine 2. Variante ist allerdings einfach nur doppelt-gemoppelt, ohne daß sich dadurch irgendetwas ändern würde.



  • Die 1.

    Edit: Visual Studio erlaubt const-references! 😮



  • David_pb schrieb:

    Edit: Visual Studio erlaubt const-references! 😮

    Wenn du damit meinst, daß man sowas schreiben kann wie " Foo & const ", das erlaubt meines Wissens auch der C++-Standard. Es ist nur vollkommen sinnfrei, schließlich sind Referenzen ohnehin konstant.



  • dooooomi schrieb:

    David_pb schrieb:

    Edit: Visual Studio erlaubt const-references! 😮

    Wenn du damit meinst, daß man sowas schreiben kann wie " Foo & const ", das erlaubt meines Wissens auch der C++-Standard. Es ist nur vollkommen sinnfrei, schließlich sind Referenzen ohnehin konstant.

    Der Standard erlaubt das nur bei Typendefinitionen, oder bei Template-Type Argumenten (im dem Fall wird ein cv-qualifier einfach ignoriert).
    Aber ja, genau das meint ich! 🙂



  • Ich nehm eigentlich auch die erste, die finde ich schöner. 😉

    Man muss halt nur schauen, wenn man beispielsweise sowas hat:

    const int* const ptr = 0;
    

    Also welches const sich auf den Zeiger (2.) und welches auf den Wert hinter dem Zeiger (1.) bezieht.

    Das Spielchen kann man auch weitertreiben... 😉

    const int * const * const ptr = 0;
    


  • Nexus schrieb:

    Das Spielchen kann man auch weitertreiben... 😉

    const int * const * const ptr = 0;
    

    Wobei hier ja keine nennenswerten Änderungen mehr spürbar werden! 😉



  • Nexus schrieb:

    Man muss halt nur schauen, wenn man beispielsweise sowas hat:

    const int* const ptr = 0;
    

    Also welches const sich auf den Zeiger (2.) und welches auf den Wert hinter dem Zeiger (1.) bezieht.

    Der Trick besteht darin

    int const * const ptr = 0;
    

    zu schreiben.

    Dann ist es naemlich logisch korrekt (von rechts nach links gelesen)
    ptr (ist ein) konstanter zeiger (auf einen) konstanten integer

    😉



  • Stimmt, das wäre intuitiver.

    Ich hab es wohl so gemacht, da ich eher const int als int const schreibe und das einfach mal so ergänzt habe. 😉


Anmelden zum Antworten