Условный тип возврата оператора и двухфазный поиск
Рассмотрим следующий фрагмент:
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&)
подобран.
Какой компилятор прав?