Резервный вариадический конструктор - почему это работает?

Отвечаяэтот вопрос о попытке создать ссылочный конструктор переменной переадресации, который следует вызывать только в том случае, если другой конструктор недопустим. То есть если бы было:

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

Мы бы хотелиC c1{"abc", 2}; позвонить (1), несмотря на необходимое преобразование, ноC c2{1, 2, 3}; для вызова (2), так как (1) не может применяться.

Я предложил следующее решение:

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

И, предложив, я имею в виду, я попробовал это и с удивлением обнаружил, что это на самом деле работает. Он компилирует и делает именно то, на что я рассчитывал как на gcc, так и на clang. Однако я затрудняюсь объяснитьЗачем это работает или даже если это на самом делепредполагаемый на работу, и GCC и Clang просто очень любезны. Это? Зачем?

Ответы на вопрос(1)

Ваш ответ на вопрос