Условный тип возврата оператора и двухфазный поиск

Рассмотрим следующий фрагмент:

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 в// 1 следует искать на первом этапе, так как тип его аргумента однозначноDerived&и, таким образом, будет решеноf(Base&) который является единственным по объему.

Clang 3.8.0 согласен со мной, ноGCC 6.1.0 неи откладывает поискf до второго этапа, гдеf(Derived&) подобран.

Какой компилятор прав?

Ответы на вопрос(3)

Ваш ответ на вопрос