考虑班级
template <typename T>
struct Foo {
Foo(const Foo<T>& other) {}
};
对于构造函数参数类型,const Foo<T>&
和const Foo&
在此上下文中是否相同?我总是假设没有,认为后者可以被称为Foo<int> f = Foo<float>()
,而前者则不能。但现在我不确定是不是这样。
答案 0 :(得分:8)
在类模板中,类模板参数对每个实例都有一个独特的含义。这意味着Foo<int>
有T==int
,因此模板化的ctor为Foo<int>::Foo(const Foo<int>& other)
。
但是可以使用其他模板参数:
template <typename T>
struct Foo {
template <typename U>
Foo(const Foo<U>& other) {}
};
现在T
可能与U
不同。
答案 1 :(得分:6)
是的,它是一样的。
这是由 inject-class-name 引起的。类名称将插入到所有类的范围中,以便名称查找能够合理地执行。当inject-name-name用作模板类中的类型名称时,它等同于模板名称,后跟<>
([temp.local]/1
)中包含的模板参数,因此{ {1}}相当于该上下文中的Foo
。