CRTP und decltype(auto): legal?



  • Folgendes funktioniert bekanntlich nicht, weil zum Zeitpunkt der Template-Instanziierung DerivedT noch nicht definiert ist:

    template <typename DerivedT>
        struct CrtpBase
    {
        static typename DerivedT::X foo(void) { return typename DerivedT::X { }; }
    };
    struct A : CrtpBase<A>
    {
        using X = int;
    };
    

    Nun fiel mir auf, daß sich das Problem bei allen gängigen Compilern (getestet mit VC++ 2017, g++ 7.1, Clang weißnichtmehr, ICC 17.x) umgehen läßt durch Verwendung von auto oder decltype(auto) als Rückgabetyp:

    static decltype(auto) bar(void) { return typename DerivedT::X { }; }
    

    Das allein reicht anscheinend aus, um die Auswertung des Rückgabetyps zu verzögern, bis die Funktion selbst instantiiert wird. Aber ist das legal/definiert?


  • Mod

    Das geht auch ohne Templates:

    struct Base
    {
        static auto bar();
    };
    struct A : Base
    {
        struct X {};
    };
    auto Base::bar() { return typename A::X { }; }
    

    Das ist unproblematisch.



  • Danke.


Log in to reply