Fallback variadic constructor - warum funktioniert das?

ei der Beantwortung vondiese Frag über den Versuch, einen variablen Weiterleitungsreferenzkonstruktor zu erstellen, der nur aufgerufen werden sollte, wenn kein anderer Konstruktor gültig ist. Das heißt, wenn es ein:

C(const char*, size_t) { }                     // 1
template <typename... T, ???> C(T&&... ) { }   // 2

Wir würden wollenC c1{"abc", 2};, um (1) aufzurufen, trotz der erforderlichen Konvertierung, aberC c2{1, 2, 3}; um (2) aufzurufen, da (1) nicht zutreffen kann.

Ich schlug die folgende Lösung vor:

template <typename... T,
          typename = std::enable_if_t<!std::is_constructible<C, T&&...>::value>
           >
C(T&&... ) { }

Und von vorgeschlagen, ich meine, ich habe es versucht und war überrascht zu entdecken, dass es tatsächlich funktioniert. Es kompiliert und tut genau das, was ich mir sowohl auf gcc als auch auf clang erhofft hatte. Allerdings bin ich ratlos, @ zu erklärWaru es funktioniert oder auch wenn es tatsächlichsol to work und gcc und clang sind beide besonders entgegenkommend. Ist es? Warum

Antworten auf die Frage(2)

Ihre Antwort auf die Frage