Я определил следующую структуру шаблона:
template<typename T> struct somestruct {};
и теперь следующие специализации:
template<typename T> struct somestruct <std::vector<T>> {}; // OK
template<typename T> struct somestruct <decltype(std::vector<T> {})> {}; // KO
Однако последняя специализация не компилируется со следующей ошибкой (см. здесь):
error: template parameters not deducible in partial specialization:
Наивно я бы сказал, что эти две специализации не так уж и различны, о чем, кажется, говорит следующее:
template<typename T> void test ()
{
static_assert (std::is_same_v<std::vector<T>, decltype(std::vector<T>{})> );
}
Вопрос: какова техническая причина, из-за которой компилятор не работает со второй специализацией? И есть ли способ это исправить (я имею в виду мой код, а не компилятор)?
Есть старый пост, который кажется похожим, но, возможно, что-то/компилятор/С++ могло измениться.





Потому что выведение аргументов шаблона не может работать из-за невыведенного контекста.
Если параметр шаблона используется только в невыведенных контекстах и не указано явно, вычисление аргументов шаблона не выполняется.
Выражение спецификатора decltype:
template<typename T> void f(decltype(*std::declval<T>()) arg); int n; f<int*>(n); // P = decltype(*declval<T>()), A = int: T is in non-deduced context
Второй фрагмент кода не совсем тот же, поскольку не используется вывод аргументов шаблона.
что ты хочешь "исправить"? Без
decltypeвсе работает как положено, не так ли?