【发布时间】:2021-03-14 13:17:36
【问题描述】:
考虑这段代码。
在进一步阅读之前尝试猜测程序的输出:
#include <iostream>
using namespace std;
template <typename T>
void adl(T) {
cout << "T";
}
struct S {
};
template <typename T>
void call_adl(T t) {
adl(S());
adl(t);
}
void adl(S) {
cout << "S";
}
int main() {
call_adl(S());
}
你做完了吗?好的。
所以这个程序的输出是TS,这看起来违反直觉(至少对我来说)。
为什么call_adl 内部的调用adl(S()) 使用模板重载而不是使用S 的那个?
【问题讨论】:
-
请注意,如果将
void adl(S)的定义移到call_adl之前,则输出为SSgodbolt.org/z/v6KThs。也许这就是你所期望的。虽然我也无法详细解释原因。 -
在尝试调用它之前,您至少需要声明
adl(S)。否则它不参与重载,你会得到模板化的版本。
标签: c++ templates overloading