Here is a simplified example:
template <typename T>
struct foo
{
foo(const T&);
template <typename U>
foo(U&&);
};
The second constructor requires some kind of template type deduction. This doesn't work in all cases, e.g. with initializer lists. The following initialization only works, if the first constructor is available:
auto f = foo<std::vector<int>>{ { 1, 2, 3 } };