C ++ 11:函数模板:通过引用

时间:2016-09-09 06:02:56

标签: c++ templates c++11

有一种模板函数可以通过引用+回调函数传递一个参数,但如果通过引用回调函数传递参数然后编译器抛出错误就会出现问题:

  

没有用于调用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 
}

1 个答案:

答案 0 :(得分:6)

第二次调用中T的扣除失败,因为T出现在两个推断的上下文中,这些上下文推导出 T

在第一个参数T& arg中,T被推断为int,因为参数x的类型为int

在第二个参数func_t<T>中,T被推断为int&,因为参数func2的类型为void(int&)

由于两个推断类型intint&对于同一参数不同,因此扣除会失败。

但是,您可以通过明确指定T应为int&来做正确的事情:

func<int&>(x, func2); // ok