C++ 模板参数推导和指向常量的指针

C++ 模板参数推导和指向常量的指针,c++,templates,C++,Templates,我定义了两个重载函数,它们的声明如下 template <class T> void Foo(const T *p); // lets call this Foo_p template <class T> void Foo(const T& r); // lets call this Foo_r 模板void Foo(const T*p);//让我们称之为Foo\u p 模板无效Foo(常量T&r);//我们把这个叫做Foo\u r 当我打电话时

我定义了两个重载函数,它们的声明如下

template <class T> void Foo(const T *p);    // lets call this Foo_p

template <class T> void Foo(const T& r);    // lets call this Foo_r
模板void Foo(const T*p);//让我们称之为Foo\u p
模板无效Foo(常量T&r);//我们把这个叫做Foo\u r
当我打电话时

Foo(ptr_至非常量)

Foo\u r
被调用。我假设在寻找最佳匹配时,指针上的常量限定条件会被去掉。由于
T*
T&
更专业化,我希望调用
Foo\u p

有谁能给我指出一个好的资源,它列出了模板参数推断规则和匹配的优先级


在这种特殊情况下,我打算为非指针类型调用
模板void Foo(const T&r)
。这是否意味着我必须定义具有和不具有
const
资格的函数。对于一个参数来说,这没什么大不了的,但是我的函数使用了不止一个指针,所以我希望避免重复。任何建议都将不胜感激。

模板扣除规则非常复杂,我不确定是否有简单的摘要。但是,如果两个模板是候选模板,其中一个需要转换,而另一个不需要转换,则会选择不需要转换以生成模板参数的模板。在您的示例中,匹配的实例化如下:

S* ptr_to_non_const = ...;
Foo(ptr_to_non_const); // => candidates:
                       //   a. F(const T&) with `T` deduced as `S*` requires no
                       //      conversion
                       //   b. F(const T*) with `T` deduced as `S` requires `S*` to
                       //      `S const*` conversion
要强制使用指针重载,可以使用
std::enable_if
std::is_pointer
从重载集中删除参考版本:

模板
typename std::enable_if::value>::type
Foo(施工及测试);;

<>虽然使用C++ 2011的特性,但是 >:d>代码> >代码> STD::ISSHIVER指针可以用C++ C++编译器实现,而且(我非常肯定已经这样做了)。超载杂志#48-2002年4月+编程主题作者:安德烈·伊尔琴科)。@bn是的,这是我能找到的唯一一本几乎详尽无遗的。谢谢你的建议谢谢,我一直在搜索模板演绎规则的描述,没有全面的内容。我想我得去看看《标准》,不确定它是否可以在网上找到,可能是一个草稿。似乎有人指着《标准》中的一篇文章:过去几卷的文章都是免费的。
template <class T>
typename std::enable_if<!std::is_pointer<T>::value>::type
Foo(const T& r);