[英]Template argument deduction and pointers to constants
我定义了两个重载函数,它们的声明如下
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
当我打电话
Foo( ptr_to_non_const );
Foo_r
被调用。 我假设在寻找最佳匹配时,常量限定从指针中剥离。 由于T*
比T&
更专业T&
我预计Foo_p
将被调用。
任何人都可以向我指出一个很好的资源,其中列出了模板参数推导规则和匹配的优先级。
在这种特殊情况下,我打算为非指针类型调用template <class T> void Foo(const T& r)
。 这是否意味着我必须定义带有和不带有const
限定条件的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<...>
从重载集中删除引用版本:
template <class T>
typename std::enable_if<!std::is_pointer<T>::value>::type
Foo(const T& r);
尽管这使用了 C++ 2011 的特性,但std::enable_if<...>
和std::is_pointer<...>
也可以用 C++ 2003 编译器很容易地实现(而且我很确定Boost已经这样做了)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.