Резервный вариадический конструктор - почему это работает?
Отвечаяэтот вопрос о попытке создать ссылочный конструктор переменной переадресации, который следует вызывать только в том случае, если другой конструктор недопустим. То есть если бы было:
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 просто очень любезны. Это? Зачем?