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