Я полагаю, что
template<char A, char ... C>
struct TrimBack<Str<C..., A>>
{
typedef Str<C...> Type;
};
не может работать ("A
" и "C...
") не может быть выведено, потому что пакет с переменным числом (C...
) не в последней позиции.
ОП, разумно, попросить ссылку
на самом деле?очень неудачноМожете ли вы случайно указать, где это сказано в стандарте?Кажется, я не могу найти соответствующую часть
Я не являюсь языковым слоем, но мне кажется, что соответствующая часть (стандарт C ++ 11) - 14.8.2.5 («Вывод аргумента шаблона из типа"," [temp.deduct.type] "), точка 9 (выделено мной)
Если P
имеет форму, содержащую <T>
или <i>
, то каждый аргумент P_i
соответствующего списка аргументов шаблона P
сравнивается с соответствующим аргументом A_i
соответствующего списка аргументов шаблона A
. Если список аргументов шаблона в P
содержит расширение пакета, которое не является последним аргументом шаблона, весь список аргументов шаблона представляет собой не выводимый контекст .Если P_i
является расширением пакета, то шаблон P_i
сравнивается с каждым оставшимся аргументом в списке аргументов шаблона A
.Каждое сравнение выводит аргументы шаблона для последующих позиций в пакетах параметров шаблона, расширенных на P_i
.
Итак, если я не ошибаюсь, TrimBack<str_t>
(он же TrimBack<Str<'a', 'b', 'c', 'd', 'e', 'f'>>
) выдает ошибку, потому что
1) на первом этапе, Str<C..., A>
соответствует Str<'a', 'b', 'c', 'd', 'e', 'f'>
2) но на втором этапе, пытаясь вывести типы C...
и A
, P
(то есть Str<C..., A>
, на этом этапе) "содержит расширение пакета, которое не является последнимАргумент шаблона ", поэтому" весь список аргументов шаблона представляет собой недоопределенный контекст ".