看不懂C++11模板函数参数推导

Can't understand C++11 template function parameter deduction

template <int T> struct int2type{};

template<int I>
void func( int2type<I> )
{
     printf("int_val: %i\n", I);
}

int main(int argc, char *argv[])
{
    func( int2type<10>() ); 
}

当然会打印 10。

我对模板和类型推导的工作原理有一些基本的了解,但我无法理解这段代码。 I背后的魔力是什么?我们如何从 int2type 实例中知道 I 传递给 func?

C++14 标准的 [temp.deduct.call] 部分介绍了模板参数推导。它太大而无法完整重现,但要点是编译器将参数类型 int2type<10> 与参数类型 int2type<I> 进行比较,并尝试为 I 找到一个值,使两者那些相同的。

在[temp.deduct.type]/9和/17中指定参数class-template-name<i>,其中i是一个非类型模板参数,由参数class-template-name<n> 其中 n 是相同类型的参数。