Поэтому, по-видимому, это должно работать:
template<class T>
struct C {
using value_type = T;
C(value_type);
};
C c(1); // C<int>
Как это (см. пример B
в [over.match.class.deduct]/3):
template<class T>
struct D {
template<class> using meow_t = T;
template<class U>
D(U, meow_t<U>);
};
D d(1, 'c'); // D<char>
Обратите внимание, что явно эквивалентное явное руководство не будет работать, поскольку параметр является не выводимым контекстом:
template<class T>
C(typename C<T>::value_type) -> C<T>;
Несмотря на то, что желательно, чтобы по крайней мере первый фрагмент работал, мне еще не удалось найти формулировку, которая фактически заставляет ее работать в текущем рабочем проекте. Кто-нибудь знает, где это?