gpt4 book ai didi

c++ - "specializations don’ t参与重载”

转载 作者:行者123 更新时间:2023-12-02 07:18:19 25 4
gpt4 key购买 nike

“函数模板的特化不参与重载解析。仅考虑基本模板”的真正含义是什么

我用其专用版本编写了一个简单的模板函数,并且可以看到调用了专用:

// Base template
template <typename T>
T max(T a, T b) {
std::cout << "Base Template" << std::endl;
return (a>b) ? a : b;
}

// Specialization for int
template<>
int max<int>(int a, int b) {
std::cout << "int specialization" << std::endl;
return (a>b) ? a : b;
}
max(2,3);// prints "int specialization"

查看与此概念相关的其他 StackOverflow,我发现了另一篇文章,其中证明特化不参与重载,他展示了以下示例,其中未调用特化版本,我仍然不确定为什么会这样没有被调用。但除此之外,在这个示例中,参数没有变量名,但 (char const* const&)

部分仍然没有编译或运行时错误
template<typename T>
void f(T const&)
{
std::cout<<std::endl<<"Base Template for f() called\n";
}

template<>
void f<char const * const &>(char const* const&)
{
std::cout<<std::endl<<"Specialized f() for char const* called\n";
}
f("Hello") //prints "Base Template for f() called"
总之,我仍在试图弄清楚“函数模板的专门化不参与重载解析。仅考虑基本模板”的含义,如果有人可以用示例来解释(以及为什么基本模板是在第二个示例中调用)。其次,为什么在第二个示例中没有变量名,程序编译并运行良好。

最佳答案

如果您尝试 max(5, 7.0),即使 double 可转换为 int,您也会收到错误。因此 maxint 特化不参与重载决策。

template <typename T>
T max(T a, T b);

template <>
int max(int a, int b);

max(5, 7.0); // compiler error (no matching function)

但是,如果您使用常规函数而不是模板专门化,您将获得预期的行为。

template <typename T>
T max(T a, T b);

int max(int a, int b);

max(5, 7.0); // this is fine

当编译器考虑参数类型(int, double)时,它会按以下顺序查找函数(使用 ADL 和其他细节会比这更复杂一些):

  • 完全匹配的函数(例如 max(int, double)。因此现阶段不会考虑 max(int, int))
  • 匹配函数模板(例如 max(T, U)。因此不会考虑 max(T, T),因为 T不能同时为 intdouble)
  • 具有兼容参数的函数(例如 max(int, int),因为 double 可以隐式转换为 int)

请注意,我没有提到函数模板特化。如果找到匹配的函数模板,将使用完全匹配的特化(因此,如果您特化为 double ,但使用 int 调用,则不会使用特化),否则将使用基本模板。

有关更好的解释,请参阅cppreference .

关于c++ - "specializations don’ t参与重载”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60054887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com