g ++ 3.4.5 принимает этот код:
template <typename T> struct A
{
static const char* const str;
};
struct B {};
typedef A<B> C;
template<> const char* const C::str = "B";
// Equivalent to following?
// template<> const char* const A<B>::str = "B";
Но я не уверен, что это на самом деле законно C ++ 03. В частности,
[14.7p3] В явном объявлении специализации для шаблона класса, члена шаблона класса или шаблона члена класса, имя класса, который явно специализирован, должно быть идентификатором шаблона.
Говорит ли это требование, что в конце этого примера должна использоваться версия без определения типа? Или я что-то неверно истолковал?
Редактировать: Дополнительные доказательства: Отчет о дефектах 403 предполагает, что неверно говорить, что тип (в этом контексте тип аргумента выражения вызова функции) является template-id потому что template-id имеет синтаксическое, а не семантическое значение. В последующих проектах стандарта использовалась «специализация шаблона класса» вместо « template-id » в 3.4.2.
Это поддерживает аргумент, что хотя A<B>
и C
представляют один и тот же тип (и имеют идентичное или почти идентичное семантическое значение), A<B>
представляет собой идентификатор шаблона и C
нет, потому что термин template-id относится к синтаксическому содержимому как к последовательности токенов, а не к значению этих токенов.