考虑以下代码:
#include <iostream>
#include <type_traits>
template <typename T>
class A
{
public:
// Allow func to be called if T is the const version of T2
// e.g., T is 'int const' and T2 is 'int'
template <typename T2,
typename = typename std::enable_if<
std::is_same<T, T2 const>::value>::type>
void func(A<T2> const &)
{
std::cout << "Conversion" << std::endl;
}
// Allow func to be called for same version of T
void func(A const &)
{
std::cout << "No conversion" << std::endl;
}
};
int main()
{
A<int const> a;
a.func(A<int const>{});
return 0;
}
此代码在使用GCC-8.3编译时会编译并产生输出No conversion
-它选择了func
不使用的版本std::enable_if
。但是,如果我注释掉的第二个版本func
,它将仍然编译并产生输出Conversion
。换句话说,这两个版本func
中A
是执行这种方法可用。鉴于两个重载都是可行的,编译器用来选择func(A const &)
其他版本(func(A<T2> const &)
)的具体规则是什么?
规则是,如果非功能模板和功能模板专业化具有相同的签名,则将选择非功能模板而不是模板专业化。可以在[over.match.best] / 2中找到
给定这些定义,如果对于所有自变量i,ICSi(F1)的转换顺序都不比ICSi(F2)差,则将一个可行函数F1定义为比另一个可行函数F2更好的函数,然后
[...]
- F1不是功能模板专业化,而F2是功能模板专业化[...]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句