Stephan T. Lavavejは、彼が話していた事件をツイートで説明しました:
私が考えていたのは、オーバーロード/テンプレート化された関数のアドレスを取得できる場所であり、特定の型の変数を初期化するためにそれが使用されている場合、どちらを使用するかが明確になります。(明確にするもののリストがあります。)
この例は、オーバーロードされた関数のアドレスのcppreferenceページから確認できます。
int f(int) { return 1; }
int f(double) { return 2; }
void g( int(&f1)(int), int(*f2)(double) ) {}
int main(){
g(f, f); // selects int f(int) for the 1st argument
// and int f(double) for the second
auto foo = []() -> int (*)(int) {
return f; // selects int f(int)
};
auto p = static_cast<int(*)(int)>(f); // selects int f(int)
}
マイケルパークは追加します:
具象型の初期化にも限定されません。引数の数だけから推測することもできます
このライブの例を提供します:
void overload(int, int) {}
void overload(int, int, int) {}
template <typename T1, typename T2,
typename A1, typename A2>
void f(void (*)(T1, T2), A1&&, A2&&) {}
template <typename T1, typename T2, typename T3,
typename A1, typename A2, typename A3>
void f(void (*)(T1, T2, T3), A1&&, A2&&, A3&&) {}
int main () {
f(&overload, 1, 2);
}
ここでもう少し詳しく説明します。