Rückgabetyp des bedingten Operators und zweiphasige Suche

Betrachten Sie das folgende Snippet:

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();
}

In diesem Fall gehe ich davon aus, dass der Funktionsaufruf anf beim// 1 sollte in Phase 1 nachgeschlagen werden, da der Typ des Arguments eindeutig istDerived&, und damit zu @ aufgelöst werdf(Base&) das ist das einzige im Bereich.

Clang 3.8.0 stimmt mir zu, aberGCC 6.1.0 nicht und verschiebt die Suche nachf bis Phase zwei, wof(Derived&) wird abgeholt.

Welcher Compiler ist richtig?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage