考虑这对简单的函数模板。
template <typename T>
void foo(T& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
template <typename C>
void foo(const C& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
如果我们使用非const参数调用foo
:
int i = 4;
foo(i);
基于[over.ics.rank] /3.2.6优先T&
重载,因为推导的引用int&
比推导出的 cv 更少参考const int&
。
但是,如果我们使用const参数调用foo
:
const int ci = 42;
foo(ci);
const C&
超载是首选,因为它更专业,而且#34;基于[over.match.best] /1.7。但是确定这个的规则是什么?我的理解是你综合了C
的类型(称之为M
)并尝试对foo(M)
进行演绎 - 但这会成功(使用T == M
)。它只是一个导致推导失败的右值 - 但编译器如何知道它必须在合成步骤中选择一个右值?