Возможные формы аргумента шаблона шаблона в экземпляре шаблона


Одной из возможных форм параметра шаблона является шаблон класса. Стандарт C++ (C++2003) утверждает, что аргумент для параметра шаблона шаблона во время создания экземпляра шаблона является "ID-выражением". Этот нетерминал довольно широк. Он позволяет использовать деструкторы, перегруженные операторы и т. д. Например, следующий код должен хорошо компилироваться:

template <template <typename x> class T>
struct MyClass
{
    T<int> a;
    T<double> b;
};

template <typename x> struct Helper
{
    ~Helper() { }
    x operator+(x p) { return(x[1]+p); }
    x[4] c;
};

 MyClass<Helper> p1;
 MyClass<~Helper> p2;
 MyClass<Helper::operaror+> p3;
Последние 2 строки не имеют никакого смысла. Но с точки зрения грамматики они прекрасны. Грамматика не является (и должна быть не) точно описать язык, но в пункте 14.3.3 "аргумент шаблона шаблона" не упоминаются какие-либо ограничения на правила грамматики в этом контексте. Может ли кто-нибудь принять или опровергнуть мои утверждения:
  1. аргумент шаблона шаблона может быть только идентификатором, возможно, квалифицированным.
  2. Если первый пункт верен, это определенно стоит упомянуть в стандарте.
1 2

1 ответ:

14.3 [темп.arg] p1

"Существует три формы шаблона-аргумента, соответствующие трем формам шаблона-параметра: тип, нетип и шаблон. Тип и форма каждого template-argument , указанного в template-id, должны соответствовать типу и форме, указанным для соответствующего параметра, объявленного шаблоном в его списке template-parameter-list.

Аргумент ~Helper не имеет правильного типа для шаблона параметр шаблона template<typename> class T, это не шаблон класса.

14.3.3 [темп.аргумент.шаблон] p1

Atemplate-argument для шаблонаtemplate-parameter будет именем шаблона класса, выраженным какid-выражение .

~Helper не является именем шаблона класса.

Это довольно ясно исключает ваши примеры.