Tipo de retorno del operador condicional y búsqueda en dos fases
Considere el siguiente fragmento:
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();
}
En este caso, creo que la función llama af
a// 1
debe buscarse en la fase uno, ya que el tipo de su argumento es inequívocamenteDerived&
, y así se resolverá af(Base&)
cuál es el único en alcance.
Clang 3.8.0 está de acuerdo conmigo, peroGCC 6.1.0 noy difiere la búsqueda def
hasta la fase dos, dondef(Derived&)
es recogido
¿Qué compilador es el correcto?