Tipo de retorno do operador condicional e pesquisa em duas fases
Considere o seguinte trecho:
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();
}
Nesse caso, acho que a chamada de função paraf
às// 1
deve ser procurado na primeira fase, já que o tipo de argumento é inequívocoDerived&
e, portanto, seja resolvido paraf(Base&)
que é o único no escopo.
Clang 3.8.0 concorda comigo, masO GCC 6.1.0 nãoe adia a pesquisa def
até a fase dois, ondef(Derived&)
é captado.
Qual compilador está certo?