bar
別の関数のパラメーター ( foo1
/ ) のコンテキストで、オーバーロードされた関数 ( ) のアドレスを解決しようとしていますfoo2
。
struct Baz {};
int bar() { return 0; }
float bar(int) { return 0.0f; }
void bar(Baz *) {}
void foo1(void (&)(Baz *)) {}
template <class T, class D>
auto foo2(D *d) -> void_t<decltype(d(std::declval<T*>()))> {}
int main() {
foo1(bar); // Works
foo2<Baz>(bar); // Fails
}
の型を明示的foo1
に指定する に問題はありません。bar
ただし、foo2
の 1 つを除くすべてのバージョンに対して SFINAE を介してそれ自体を無効bar
にすると、次のメッセージが表示されてコンパイルに失敗します。
main.cpp:19:5: fatal error: no matching function for call to 'foo2'
foo2<Baz>(bar); // Fails
^~~~~~~~~
main.cpp:15:6: note: candidate template ignored: couldn't infer template argument 'D'
auto foo2(D *d) -> void_t<decltype(d(std::declval<T*>()))> {}
^
1 error generated.
C++ では、オーバーロードされた関数のアドレスを解決すると同時に、テンプレート引数の推定を実行できないことを理解しています。
それが原因ですか?foo2<Baz>(bar);
(または同様のもの) をコンパイルする方法はありますか?