2017-07-29 9 views
15

このコードはなぜコンパイルされますか?constで&std :: functionで無視されますか?

std::function<void(const int&)> f = [](int a) 
{ 

}; 

intconst int&異なる種類ではありませんか?

+3

'f'はconst参照をラムダに簡単に転送できるので有効です。 const参照を受け取り、ラムダのように 'int'を受け付ける関数に転送する関数を定義してみてください。それはうまくいく?それで、なぜこの場合には動作しないのですか? – skypjack

+0

Arthur O'Dwyerという名前の豪華な紳士がCppCon 2016でテンプレートとテンプレートタイプの控除について話をしました。これはYouTubeのhttps://www.youtube.com/watch?v=vwrXHznaYLAにあります – systemcpro

答えて

20

const int&引数はintパラメータに渡すことができますが、これはすべて必須です。

16

仕事にあなたのコードの理由は、任意の関数オブジェクト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ための要件を満たしています。

関連する問題