Template Aliase und Sfinae

Im Falle eines Substitutionsfehlers mit einem Vorlagenalias (z.B. Sollte ein Vorlagenalias für einen fehlenden Elementtypnamen (wie im folgenden Code-Snippet) ein Fehler ausgelöst werden?

Clang und gcc scheinen sich diesbezüglich nicht einig zu sein:

// some types
struct bar { };

struct foo {
    typedef void member_type;
};


// template alias
template<class T>
using member = typename T::member_type;


template<class T>
void baz(... ) { }

// only works for gcc, clang fails with: no type named 'member_type'
// in 'bar'
template<class T>
void baz( member<T>* ) { }


int main(int, char** ) {

    baz<bar>(0);            // picks first
    baz<foo>(0);            // picks second

    return 0;
}

Die Frage ist also: Wer ist richtig und warum?

Vielen Dank :-)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage