【发布时间】:2016-05-06 09:33:52
【问题描述】:
我有一个模板函数,func:
template<typename T>
void func(T p) { f(p); }
还有一组函数f:
f(SomeType&);
f(int);
...
如果我实例化模板函数func,使用引用作为函数参数p,而没有明确指定模板参数T,那么推导的类型将不是p的引用类型,而是p 类型是一个引用,例如:
SomeType s;
SomeType& ref_to_s = s;
func(ref_to_s); // Type deduction results in: func<SomeType>(ref_to_s)
func<SomeType&>(ref_to_s); // Need to explicitly specify type to work with reference
所以,我的问题是:
- 为什么在上述情况下编译器无法推断出引用类型
SomeType&? - 有没有办法定义模板函数
func,以便类型推导适用于引用类型,而无需显式指定模板参数T?
需要明确的是,我想要两者都可以使用的东西(参见上面的函数f):
func(ref_to_s); // Calls func<SomeType&>(ref_to_s)
func(1); // Calls func<int>(1)
【问题讨论】:
-
很明显,这就是模板参数推导的工作原理。