别名模板(14.5.7)可以显式专门化(14.7.3)吗?
我的标准 fu 失败了,我找不到编译器来测试。
文本“当 template-id 引用别名模板的专门化时”意味着yes,但这个例子似乎指的是其他东西,暗示no.
NB. I'm working from n3242, one behind the FDIS, in which the title of this section is "Aliase templates". Lol.
标准中“专业化”的含义是将通用模板转换为更专业实体。例如,实例化一个非成员类模板会生成一个不再是模板的类。术语“专业化”有两个含义,可以指生成的专业化(这是实例化的专业化,可能来自部分专业化)和显式专业化(这就是您所提到的)。
别名模板不会实例化,也没有专门化。他们没有什么可以实例化的。相反,每当它们的名称后面跟着模板参数列表时,所表示的类型就是通过将名称和参数列表替换为别名类型、将所有模板参数引用替换为参数列表中给出的参数而获得的类型。也就是说,别名模板本身就充当别名,而不需要实例化任何内容,而不是专门化为别名。这个替换很早就完成了。考虑:
template<typename T> using ref = T&;
template<typename T> void f(ref<T> x) { x = 10; }
int main() { int a; f(a); return a; /* 10 */ }
更换工作当时已完成ref<T>
被命名(此类名称用于引用类或函数模板特化;因此规范将此类名称描述为“引用别名模板的特化”)。也就是说,参数f
有类型T&
, 因此,T
可以推论出。此属性防止别名模板的显式或部分特化。因为为了选择正确的专业ref
,它需要知道T
。但要知道它需要比较ref<T>
针对参数类型进行推导T
。论文中总结了N1406,“建议对 C++ 进行补充:Typedef 模板”,第 2.2 节
2.2 主要选择:专业化与其他一切
经过对反射器和进化工作组的讨论后,结果表明我们必须在两个互斥的模型之间进行选择:
typedef 模板本身并不是别名;它是一个别名。只有 typedef 模板的(可能是专门的)实例是别名。这种选择使我们能够专门化 typedef 模板。
-
typedef 模板本身就是一个别名;它不能被专门化。这个选择将允许:
- typedef模板函数参数的推导(见2.4)
- 使用 typedef 模板表达的声明与不使用 typedef 模板的声明相同
typedef 模板(参见 2.5)
- typedef 模板来匹配模板模板参数(参见2.6)
应该指出的是,引用的论文支持选项 1,但并未进入 C++0x。
编辑:因为你迫切希望有一个规范报价如此明确地说。 14.5p3 就是这样的
由于别名声明无法声明模板 ID,因此无法部分或显式特化别名模板。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)