有一种模板函数可以通过引用+回调函数传递一个参数,但如果通过引用回调函数传递参数然后编译器抛出错误就会出现问题:
没有用于调用
func(int&, void (&)(int&))
的匹配函数。
出了什么问题?
template<typename T>
using func_t = void(T);
template<typename T>
void func(T& arg, func_t<T> callback) {
callback(arg);
}
void func1(int arg) { }
void func2(int& arg) { } //<-- (1)
int main() {
int x = 0;
func(x, func1);
func(x, func2); //<-- (2) compilation error
}
答案 0 :(得分:6)
第二次调用中T
的扣除失败,因为T
出现在两个推断的上下文中,这些上下文推导出 T
的值。
在第一个参数T& arg
中,T
被推断为int
,因为参数x
的类型为int
。
在第二个参数func_t<T>
中,T
被推断为int&
,因为参数func2
的类型为void(int&)
。
由于两个推断类型int
和int&
对于同一参数不同,因此扣除会失败。
但是,您可以通过明确指定T
应为int&
来做正确的事情:
func<int&>(x, func2); // ok