通常在C类定义中,特别是在库,特征类等中,您会看到类似于以下代码段的代码:
template <typename Bar, typename Baz>
class Foo {
using bar_type = Bar;
using baz_type = Baz;
// ... etc.
}
只有这些行你才可以参考 Foo<A,B>::bar_type
或 Foo<C,D>:baz_type
. 我是语言标准要求编译器使用typename模板参数自动定义类型,即允许使用行删除两个,并将 Foo<A,B>::Bar
识别为 A
和 Foo<C,D>::Baz
为 D
?
这甚至不应该破坏现有代码,因为在Foo中,无论如何都已经使用了标识符Bar和Baz .
1 回答
参数名称不是要声明的实体的一部分 . 对于函数和模板都是如此 . 以下代码仅声明两个单独的实体:
请特别注意以下代码完全正常:
从参数名称派生其他结构的所有尝试都必须处理这种情况 . 该领域最受欢迎的请求之一是命名函数参数;到目前为止,没有一个令人满意的延期提议 .
在某种程度上,所有这些提议都需要使参数名称成为声明实体的一部分 . 例如,对于函数,这会引发一个问题,即参数名称是否需要被修改并暴露给链接器 .