const int f() vs int f()



  • jo, ist völlig sinnfrei. der Rückgabewert ist ein rvalue und damit sowieso "konstant".



  • jo, ist völlig sinnfrei. der Rückgabewert ist ein rvalue und damit sowieso "konstant".

    Aber Achtung. Das gilt nur bei built-ins. Deshalb ist ein const beim value-return von udts schon sinnvoll.

    [ Dieser Beitrag wurde am 02.04.2003 um 20:55 Uhr von HumeSikkins editiert. ]



  • hum`? wie jetzt -- kannst du das an einem einfachen beispiel erläutern?

    Beechen



  • oh.



  • struct demo
    {
      inline demo &operator=(int) { return *this; }
    };
    
    demo foo(void)
    {
      return demo();
    }
    
    const demo bar(void)
    {
      return demo();
    }
    
    int main()
    {
      foo()=1;
      bar()=1;
    }
    
    > g++ -Wall -W -std=c++98 -O3 -o constret constret.cc
    constret.cc: In function `int main()':
    constret.cc:19: passing `const demo' as `this' argument of `demo& 
       demo::operator=(int)' discards qualifiers
    


  • hmm oki, danke erstmal für das beispiel, aber ist es wirklich sinnvoll einer funktion einen wert zuweisen zu wollen?

    -- wenn nicht, warum dann das const vor der funktion?, ich mein wenn jemand so schlau(?) ist eine zuweisung an eine funktion zu machen zu wollen, dann soll er doch... der klasse an sich, kann er damit doch nix tun oder?!



  • DATID
    Do As The Ints Do
    Das ist die Regel, nach der sich alles richtet



  • hmm oki, danke erstmal für das beispiel, aber ist es wirklich sinnvoll einer funktion einen wert zuweisen zu wollen?

    Neben der DATID Regel, könnte die Funktion ja auch eine Referenz zurückliefern

    #include <iostream>
    
    class foo
    {
      int i;
    public:
      inline foo(int j=0) : i(j) { }
      inline foo &operator=(int j) 
      { 
        i=j; 
        return *this; 
      }
      inline operator int() { return i; }
    };
    
    foo &bar(void)
    {
      static foo x=5;
      std::cout << x << std::endl;
      return x;
    }
    
    int main()
    {
      bar()=1;
      bar();
    }
    

    (allerdings sollte man solchen Code nicht schreiben IMHO ;))



  • DATID
    Do As The Ints Do
    Das ist die Regel, nach der sich alles richtet

    Ich möchte hier nochmal darauf Hinweisen, dass diese allseits gerne zittierte Regel so nicht vollständig ist.
    Das Original lautet:
    When in doubt, do as the ints do.

    Und das "when in doubt" ist meiner Meinung nach genausowichtig wie der zweite Teil.



  • normalerweise zweifelt man immer 😃
    Don't panic -> DATID


Anmelden zum Antworten