auto und decltype



  • wo ist der unterschied zwischen den folgenden 3 beispielen?
    so weit ich weiß funktionieren alle gleich und ich bin mir nie sicher wann ich was verwenden soll 😕

    class c{
       double d;
       auto get_d(){
         return d;
       }
    };
    
    class c{
       double d;
       decltype(d) get_d(){
         return d;
       }
    };
    
    class c{
       double d;
       auto get_d() -> decltype(d){
         return d;
       }
    };
    


  • Was spricht gegen:

    class c{
       double d;
       double get_d(){
         return d;
       }
    };
    

    Der Rueckgabetyp ist eh bekannt und es sind keine Templates involviert.



  • In deinem Beispiel macht das kein Unterschied.

    Generell gilt:
    - auto: Kein SFINAE, aber wenig Bloat. Damit kannst du Lambdas zurückgeben. Erst ab C++14
    - decltype(d): SFINAE auf d, d.h. wenn d nicht kompiliert fällt die Funktion aus der Liste der Kandidaten.
    - auto f-> decltype(d): wie decltype(), nur dass hier "this" und die Parameter bekannt sind und im Ausdruck vorkommen dürfen.



  • Was spricht gegen:
    C++:
    class c{
    double d;
    double get_d(){
    return d;
    }
    };
    Der Rueckgabetyp ist eh bekannt und es sind keine Templates involviert.

    Sorry, aber da macht man sich die mühe ein vereinfachtes beispiel zu machen weil man bestimmte c++11 features generell nicht auf einen bestimmten fall bezogen nicht versteht und nicht sein ganzen projekt posten will und dann kommen immernoch solche dämlichen kommentare.

    In deinem Beispiel macht das kein Unterschied.

    Generell gilt:
    - auto: Kein SFINAE, aber wenig Bloat. Damit kannst du Lambdas zurückgeben. Erst ab C++14
    - decltype(d): SFINAE auf d, d.h. wenn d nicht kompiliert fällt die Funktion aus der Liste der Kandidaten.
    - auto f-> decltype(d): wie decltype(), nur dass hier "this" und die Parameter bekannt sind und im Ausdruck vorkommen dürfen.

    danke, ich google mal eben ein paar fachausdrücke (SFINAE, usw.), aber ich glaube ich habs verstanden. Danke 👍 🙂



  • gamer8o4 schrieb:

    kommen immernoch solche dämlichen kommentare

    Willkommen im Internet.



  • differenzler schrieb:

    - auto: Kein SFINAE,

    Das ist mindestens missverständlich. Bitte erklären.



  • krümelkacker schrieb:

    differenzler schrieb:

    - auto: Kein SFINAE,

    Das ist mindestens missverständlich. Bitte erklären.

    Ich meine damit, dass

    #include <iostream>
    template <typename T>
    auto f(T t) { std::cout << t.foo() << '\n'; }
    void f(...) { std::cout << "bar\n"; }
    int main() { f(4); }
    

    nicht kompiliert, aber

    #include <iostream>
    template <typename T>
    auto f(T t) -> decltype(std::cout << t.foo() << '\n') { std::cout << t.foo() << '\n'; }
    void f(...) { std::cout << "bar\n"; }
    int main() { f(4); }
    

    schon.


Anmelden zum Antworten