wim*_*aan 6 c++ templates overload-resolution
我试图了解以下情况下的重载决策规则:
template<typename T>
void f(const T& x) {
std::cout << __PRETTY_FUNCTION__ << std::endl; //-
}
template<typename T>
void f(T& x) { // <> Überladung Variante 2
std::cout << __PRETTY_FUNCTION__ << std::endl; //-
}
int main()
{
int e1 = 0;
f(e1);
const int e2 = 0;
f(e2);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
void f(T &) [T = int]
void f(const T &) [T = int]
Run Code Online (Sandbox Code Playgroud)
正如我在第一次致电中所理解的那样,f(e1)导致了可行的功能
void f(const int&)
void f(int&)
Run Code Online (Sandbox Code Playgroud)
从中选择第一个,因为不必删除const限定.
第二次调用f(e2)导致类型扣除/可行功能
void f(const int&); // T -> int from first template overload
void f(const int&); // T -> const int from second overload
Run Code Online (Sandbox Code Playgroud)
并且输出显示选择了第一个过载.
但为什么?
当使用引用执行类型推导时,const-ness(更具体地说是 CV-ness)不会被删除。因此,在您的情况下,编译器有 2 个重载可供选择:
void f(const T &)
void f(T &)
Run Code Online (Sandbox Code Playgroud)
然后,编译器在为参数选择重载时执行“模式匹配” const int e2 = 0;。第一个const重载是更好的匹配(更专业),因为第二个重载需要推导Tas const int,这会增加一些东西(即const-ness)。
模板类型推导的规则并不是非常简单,所以如果您想了解有关模板的所有细节,我强烈推荐这本书
C++ 模板:完整指南,作者:David Vandevoorde 和 Nicolai M. Josuttis。
它是 C++11 之前的版本,但它仍然告诉您您能想到的一切。
PS:必须区分实例化和模板类型推导。首先进行类型推导,然后进行实例化。因此,在您的情况下,您不会像您最初想象的那样有两个不明确的实例。
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |