Фон
Вчера я задал вопрос о гарантиях использования руководств для вычетов в случае шаблонных параметров шаблона. Я был очень удивлен, когда Барри изменил свой ответ на подтверждение стандартной совместимости кода. Мое удивление на самом деле не объясняется тем фактом, что гистограммы дедукции могут применяться для параметров шаблона шаблона, но больше от стандартной части, которая соответствует этому соответствию, а именно [temp.param]/3:
Параметр типа, идентификатор которого не следует за многоточием, определяет его идентификатор как typedef-name (если объявлено без
template
) или имя шаблона (если объявлено с помощьюtemplate
) в области действия объявления шаблона.
Этот плюс [temp.deduct.guide]/1 и правило для simple-template-id позволит создать общий гид вычитания, принимающий любой шаблон.
Пример
#include <string>
template <class T>
struct Foo {
Foo(T) { }
};
template <template <class> class TT>
TT(const char *) -> TT<std::string>;
int main() {
Foo foo("abc");
}
Вопрос
Код вызывает gcc для сбоя с внутренней ошибкой и приводит к ошибке компиляции в clang. Чтобы быть прямым, я не, говоря, что код должен быть фактически разрешен на С++, но думаю, что текущая формулировка делает его совместимым. Я пропустил какое-то важное правило, которое запрещает код?