需要了解函数模板解析规则(Need to understand function template

2019-10-19 11:27发布

我真的由模板重载/专业化解决规则的某些细节混淆。 我想通过这篇文章会得到一些关于这个问题的理解香草萨特模板超载/专业化 。 我卡在文章下面的特定点。

这里是

Consider the following code:
// Example 2: Explicit specialization 
// 
template<class T> // (a) a base template 
void f( T );
template<class T> // (b) a second base template, overloads (a) 
void f( T* );     //     (function templates can't be partially 
                  //     specialized; they overload instead)
template<>        // (c) explicit specialization of (b) 
void f<>(int*);
// ...
int *p; 
f( p );           // calls (c)
The result for the last line in Example 2 is just what you'd expect. The question of the day, however, is why you expected it. If you expected it for the wrong reason, you will be very surprised by what comes next. After all, "So what," someone might say, "I wrote a specialization for a pointer to int, so obviously that's what should be called" - and that's exactly the wrong reason.
Consider now the following code, put in this form by Peter Dimov and Dave Abrahams:
// Example 3: The Dimov/Abrahams Example 
// 
template<class T> // (a) same old base template as before 
void f( T );
template<>        // (c) explicit specialization, this time of (a)
void f<>(int*);
template<class T> // (b) a second base template, overloads (a) 
void f( T* );
// ...
int *p; 
f( p );           // calls (b)! overload resolution ignores 
                  // specializations and operates on the base 
                  // function templates only

I实施例2和实施例3之间看到的唯一区别是在其中的模板b和c声明的顺序。 我不明白为什么这让一切变得不同。 什么是秩序宣言有什么关系呢? 我必须错过了C ++的基本概念,我没有看到的是,文章中的解释。

我会很感激有人清除这件事对我来说。

谢谢。

Answer 1:

什么是秩序宣言有什么关系呢?

专业化的声明必须始终遵循其被专门的模板(14.7.3 / 3)的声明。 在实施例2,(c)是两个的明确专业化的(a)和(b)。 在实施例3,(c)是只的(a)中,由于(B)如下它明确专业化。

当执行重载决策,不要紧模板是否有明确的专业化与否。 在这两个例子中,重载决策选择在模板(B)(A),因为它更专业(14.5.6.2)。 在例2中,它实际上并不无论选择哪一个,因为(c)是两个模板的一个特例,所以它被调用无论发生什么。 在实施例3,这非常重要。 由于(B)赢得重载决议及(c) 不是第(二)专业化,它遵循(C)不会被调用。



Answer 2:

在第二个例子专业化发生的class T模板,因为class T*模板甚至没有在那里专业化声明的申报点还。

所以,当编译器去并寻找最佳匹配模板,它选择正确的class T*模板,它没有专业化。



文章来源: Need to understand function template resolution rules