explicit
2 つのコンストラクター オーバーロード (異なる型に基づく)が与えられstd::function<...>
た場合、の戻り値はどちらかstd::bind
を選択できます(それにより、呼び出しがあいまいになります)。
call of overloaded ‘Bar(std::_Bind_helper<false, void (Foo::*)(int),
Foo*, int>::type)’ is ambiguous
どちらかをコメントアウトすると、コードがコンパイルされます!
explicit
コンストラクターを作成すると、正しいオーバーロードが選択されるか、両方が選択されないようになると思いましたか?
もちろん、バインドした時点で明示的にa を作成すると、次のように機能します。std::function
Bar b(std::function<void(int)>(std::bind((&Foo::process), &f, 1)));
しかし、なぜ型推論が機能しないのか、私は戸惑っていますか?
- からの戻り値
std::bind
が 2 つのコンストラクター シグネチャのいずれにも一致しない場合、それらがexplicit
両方とも選択されないようにする必要があります。 - からの戻り値
std::bind
が 2 つのコンストラクター シグネチャのいずれかに一致する場合、それらが一致するという事実explicit
により、正しいものが選択されるはずです。
ここで実際に何が起こっているのですか?
以下の完全な作業コード:
#include <functional>
struct Foo
{
void process(int) { }
};
struct Bar
{
// comment out either of these to compile
explicit Bar(std::function<void(int)>) {}
explicit Bar(std::function<void(short)>) {}
};
int main()
{
Foo f;
Bar b(std::bind(&Foo::process, &f, 1));
return 0;
}