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

Cfo*_*fon 4 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 
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 6

T第二次调用中的扣除失败,因为T在推导出不同值的两个推导上下文中发生T.

在第一个参数中,由于参数具有类型T& arg,T因此推导出.intxint

在第二个参数中,由于参数具有类型func_t<T>,T因此推导出.int&func2void(int&)

由于两个推导出的类型,int以及int&相同参数的不同,因此推论失败.

但是,您可以通过明确指定T应该是int&:

func<int&>(x, func2); // ok
Run Code Online (Sandbox Code Playgroud)