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
oderdecltype(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?
-
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.