次のスニペットを検討してください。
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
atへの関数呼び出し// 1
はフェーズ 1 で検索する必要があると思います。その引数の型は明白であり、スコープ内の唯一のものにDerived&
解決されるからです。f(Base&)
Clang 3.8.0 は私に同意しますが、GCC 6.1.0 は同意せず、がピックアップさf
れるフェーズ 2 までのルックアップを延期します。f(Derived&)
どのコンパイラが正しいですか?