重载决策和部分模板排序

时间:2015-06-25 13:03:04

标签: c++ templates language-lawyer overload-resolution

考虑这对简单的函数模板。

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)。它只是一个导致推导失败的右值 - 但编译器如何知道它必须在合成步骤中选择一个右值?

0 个答案:

没有答案