Являются ли параметры шаблона шаблона шаблона расширением или частью стандарта?

Я искал что-то еще, связанное с параметрами шаблона шаблона, и наткнулся на этот ответ, в котором утверждается, что параметры шаблона шаблона не разрешено стандартом.

Однако следующий код компилируется в последней версии clang (3.2) и последней версии GCC (4.8):

template<template<template<typename> class> class T> struct test {};
template<template<typename> class T> struct foo {};
test<foo> bar;

Является ли это расширением или другой ответ на самом деле неверен и разрешен стандартом? Если нет, то есть ли какая-то конкретная причина для упущения?


person celticminstrel    schedule 05.07.2012    source источник
comment
@chris OP, вероятно, означает снимок версии 4.8. Я использую один некоторое время.   -  person juanchopanza    schedule 05.07.2012
comment
Да, у меня есть снимки с MacPorts... так что, вероятно, это не последний svn или что-то в этом роде.   -  person celticminstrel    schedule 05.07.2012
comment
он также компилируется в gcc 4.5 на Ideone ideone.com/BUAuw   -  person TemplateRex    schedule 05.07.2012
comment
О, да, код, который я разместил, не может быть связан, поскольку нет main().   -  person celticminstrel    schedule 05.07.2012
comment
MSVC 2010 также компилирует это.   -  person user396672    schedule 05.07.2012


Ответы (1)


В std::vector<int> шаблону класса std::vector передается тип int в качестве параметра. В std::get<42>(some_tuple) шаблону функции std::get передается значение 42 в качестве параметра. Возможно, первый тип аргумента невообразимо называется аргументом типа шаблона (или аргументом типа шаблона), а второй тип является (шаблонным) аргументом, не являющимся типом.

Но шаблоны также могут принимать аргументы другого типа: другие шаблоны. Например, template<template<typename> class T> void foo(); объявляет шаблон функции, принимающий шаблон в качестве аргумента, который сам принимает аргумент типа. (Обратите внимание, хотя шаблоны не являются типами, термин «аргумент, не являющийся типом», по-прежнему не распространяется на аргументы шаблона. Он зарезервирован для таких аргументов, как template<int NonTypeArgument>.)

Поскольку в C++ нет такой вещи, как шаблон шаблона (есть шаблоны классов, функций и псевдонимов, но все вместе они являются просто "шаблонами"), нет такой вещи, как параметр шаблона шаблона. То, что у вас есть, — это запуск параметра шаблона шаблона мельницы, где ожидаемый аргумент шаблона имеет сам аргумент шаблона шаблона. Я не могу найти ссылку в Стандарте, которая запрещает это, например, ответ, на который вы ссылаетесь.

person Luc Danton    schedule 05.07.2012