考虑这对简单的函数模板.
template <typename T>
void foo(T& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
template <typename C>
void foo(const C& ) { std::cout << __PRETTY_FUNCTION__ << '\n'; }
Run Code Online (Sandbox Code Playgroud)
如果我们foo使用非const参数调用:
int i = 4;
foo(i);
Run Code Online (Sandbox Code Playgroud)
的T&过载是基于[over.ics.rank]优选/3.2.6,由于推定的参考int&是以下CV -qualified比推导的参考const int&.
但是,如果我们foo使用const参数调用:
const int ci = 42;
foo(ci);
Run Code Online (Sandbox Code Playgroud)
的const C&过载是优选的,因为它是"更专门的"基于[over.match.best] /1.7.但是确定这个的规则是什么?我的理解是你合成了一个类型C(调用它M)并尝试执行演绎foo(M)- 但这会成功(带T == M).它只是一个rvalue会导致演绎失败 - 但编译器如何知道它必须在合成步骤中选择一个rvalue?