Frage zu SFNIAE und std::void_t
-
Ich kenne diesen Trick für Expression SFINAE:
template<typename T, typename = void> struct test : std::false_type {}; template<typename T> struct test<T, std::void_t<decltype(std::declval<T>() == nullptr)>> : std::true_type {};
Meine Fragen dazu:
1. Wieso wird die Spezialisierung überhaupt instantiiert?test<T,void>
mit der unspezialisierten Grundklasse ist doch schon "vollständig" und well-formed.
2. Wieso kann ich nicht mehrere Spezialisierungen mit unterschiedlichen Ausdrücken indecltype
schreiben? Es kommt ein Fehler von wegen Redefinition, obwohl die Spezialisierungen dann doch eigentlich in unterschiedlichen Fällen zutreffen oder scheitern würde.Danke im Voraus.
-
1. Partielle Spezialisierungen werden immer dem Primärtemplate vorgezogen.
2. VC++, nehme ich an? Der Compiler hat Schwierigkeiten mit Templates die sich nur in expression SFINAE unterscheiden. Siehe bspw. diese von mir beantwortete Frage.
-
Danke! Genau, was ich gesucht habe.