Clang не наследует шаблон конструктора при добавлении второго параметра шаблона и аргумента по умолчанию. С другой стороны, у него нет проблем, когда в списке параметров функции используется конструкция SFINAE (стиль C ++ 03):
struct Foo {
Foo() = default;
template<typename T>
Foo(T& object, std::enable_if_t<std::is_trivially_copyable_v<T>>* = nullptr) {}
};
struct Bar : public Foo {
using Foo::Foo;
template<typename T>
Bar(T& object, std::enable_if_t<!std::is_trivially_copyable_v<T>>* = nullptr) {}
};
Живой пример
В этой версии шаблон конструктора наследуется очень хорошо и используется в разрешении перегрузки, как и следовало ожидать.
Перемещение вашей собственной проверки SFINAE в параметр c'or без изменения Foo
также, кажется, разрешает это:
struct Foo {
Foo() = default;
template<typename T, std::enable_if_t<std::is_trivially_copyable_v<T>>* = nullptr>
Foo(T& object) {}
};
struct Bar : public Foo {
using Foo::Foo;
template<typename T>
Bar(T& object, std::enable_if_t<!std::is_trivially_copyable_v<T>>* = nullptr) {}
};
Живой пример
Clang считает подпись вашего исходного шаблона идентичной подписи из базового класса. И поэтому он считает версию базового класса скрытой.