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?