#include <functional>
void foo(std::function<void()> f) { f(); }
void foo(void (*f)()) { f(); }
int main ()
{
foo( [](){} );
}
VS コンパイル、gcc および clang は、あいまいなオーバーロードについて不平を言います。誰が正しいですか?ラムダはクラス型であると想定されているため、ラムダと関数ポインターの間で変換を行うべきではありません。したがって、VS はすべての可能性に反して正しいように見えます。しかし、おそらく私は何かを見逃しています。
ラムダをどちらかの型にキャストする以外に、呼び出しを明確にする簡単な方法はありますか?