はバインドから返されたオブジェクトは余分な引数を無視するのはなぜですか?
void f(int x, int y);
、私は2つの引数を取る関数があると仮定し、私はそれらのいずれかをバインドします。次のように私はstd::bind
を使用することができます。
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF
は、引数を1つしかかかりますが、私は、複数でそれを呼び出すことができます。
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
追加の引数を渡すことが許可オブジェクトの目的はbind
から返されるもの:最初越えた引数は、さらに任意の理にかなっているタイプである必要はありませんか?これは、他の場所で拒否される呼び出しエラーをコンパイルすることを可能にします。
どのようなコンパイラですか?これらの追加引数を許可することは実際には意味をなさないので、標準に準拠していないコンパイラである可能性があります。例えば、MSVCはバリデーショナルテンプレートを最大限に活用するようにバリデーショナルテンプレートを定義するだけで、バリデーショナルテンプレートをエミュレートし、NILタイプにデフォルト設定します。それはあなたの行動の原因でしょうか? –
@ChristianRau:これは標準の一部です。それもTR1の一部でした。 20.8.2/4は、バリデーションテンプレート化された 'operator()'が、引数の型や数にかかわらず、渡されたものをそのまま受け入れることを想定しているとのコメントをしています。 TR1も同様の表現をしています。 – KnowItAllWannabe
あなたのケースでは、 'N = sizeof ...(bound_args)'(呼び出しをバインドする引数の数)は有効な式でなければなりません。20.8.9.1.2/2を参照してください。 20.8.2/1。編集:それはそれを呼び出すための他の方法を禁止しません。 – dyp