Фон
Вчера я задал вопрос о гарантиях удержания руководит использованием в случае параметров шаблона шаблона. Я был очень удивлен, когда Барри изменил свой ответ на подтверждение соответствия кода стандарту. Мое удивление на самом деле исходит не от того факта, что руководства по выводу могут применяться к параметрам шаблона шаблона, а от стандартной части, которая соответствует этому соответствию, а именно [temp.param] / 3:
параметр-тип, идентификатор которого не следует за многоточием, определяет его идентификатор как typedef-name (если объявлен без
template
) или template-name em > (если объявлено с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. Честно говоря, я не говорю, что код действительно должен быть разрешен в C ++, но думаю, что текущая формулировка действительно делает его совместимым. Я упустил какое-то важное правило, запрещающее код?