考虑以下代码段:
struct Base { };
struct Derived : Base { };
void f(Base &) { std::cout << "f(Base&)\n"; }
template <class T = int>
void g() {
Derived d;
f(T{} ? d : d); // 1
}
void f(Derived &) { std::cout << "f(Derived&)\n"; }
int main() {
g();
}
在这种情况下,我认为应该在第一阶段查找对f
at的函数调用,因为它的参数类型是明确的,因此被解析为范围内唯一的类型。// 1
Derived&
f(Base&)
Clang 3.8.0 同意我的观点,但GCC 6.1.0 不同意,并将查找推迟f
到第二阶段,即在哪里f(Derived&)
被拾取。
哪个编译器是正确的?