このコードはなぜコンパイルされますか?constで&std :: functionで無視されますか?
std::function<void(const int&)> f = [](int a)
{
};
はint
とconst int&
異なる種類ではありませんか?
このコードはなぜコンパイルされますか?constで&std :: functionで無視されますか?
std::function<void(const int&)> f = [](int a)
{
};
はint
とconst int&
異なる種類ではありませんか?
const int&
引数はint
パラメータに渡すことができますが、これはすべて必須です。
仕事にあなたのコードの理由は、任意の関数オブジェクトF
を取るstd::function<R(Args...)>
のテンプレートコンストラクタがArgs...
がR
を返すと呼び出し可能であることをF
を必要とすることです。
template<class R, class... ArgTypes> class function<R(ArgTypes...)> { template<class F> function(F f); };
必要です:
F
はコピーコンストラクトしなければなりません。 fは、引数タイプArgTypes
と戻り値タイプR
の場合はとなります。となります。 [...]int
を取る
関数オブジェクトはconst int&
を使用して呼び出し可能であり、したがって、このコードは有効であり、両方のリターンvoid
ための要件を満たしています。
'f'はconst参照をラムダに簡単に転送できるので有効です。 const参照を受け取り、ラムダのように 'int'を受け付ける関数に転送する関数を定義してみてください。それはうまくいく?それで、なぜこの場合には動作しないのですか? – skypjack
Arthur O'Dwyerという名前の豪華な紳士がCppCon 2016でテンプレートとテンプレートタイプの控除について話をしました。これはYouTubeのhttps://www.youtube.com/watch?v=vwrXHznaYLAにあります – systemcpro