2015-10-23 5 views
9

C++のlambdaは、関数オブジェクトを必要とするテンプレートでは使いやすいでしょうが、デフォルトでは構築できません。空のキャプチャリストを持つlambdaがデフォルトで構築できないのはなぜですか?

この質問で説明したように、これは非空のキャプチャリストを持つラムダにとって意味があります。

Instantiating C++ lambda by its type

Kerrekは説明する:

コードは意味がありません。これは、あなたが のようなキャプチャラムダを持って想像:それはおそらくタイプ decltype(t)のオブジェクトをデフォルト・構築するために何を意味するかもしれません

{ 
    int n = 0; 
    auto t = [&n](int a) -> int { return n += a; }; 
} 

空のキャプチャリストを持つラムダはどうなりますか?それらがデフォルト構成に意味をなさない理由はありますか? 「標準はそうだ」よりも何かがありますか?

+0

指定されていない型をデフォルトで構築する方法はありますか?なぜ 'std :: function'にラムダを割り当てることができるときにこれをしたいのですか? – 101010

+2

@ 101010この例では、型は 'decltype(t)'です。 'std :: function'はこの場合不要な間接を導入するので(ラダーは何を望んでいるのか疑問はありません)それが使用されている場所に置くことができます。 – Praxeolitic

答えて

4

一般的に、lambdaは特定のユースケースを解決するためにできるだけ指定されていません。

他の有用なものとして、「些細なコピー可能なデータだけをコピーしなければならないラムダ」も省略した。 (標準ではラムダが簡単にコピー可能であるかどうかは指定されていません)

ラムダがラムダを機能を実装しやすくすることが重要です。これは重要です。欠点は、これが "意図された"セットにない特定の用途を排除することです。

"キャプチャフリーのラムダに引数のないコンストラクタが必要です"と考える場合、重要なことを提案してください。しかしこれはlambda(簡単なローカルキャプチャと関数オブジェクトの作成)を使用し、それを別のものに変形します(タイプを渡すことができるステートレス関数オブジェクトの作成が簡単です)。

+0

委員会またはよく知られているC++の指導者に関与していない人々からの提案が受け入れられましたか? – Praxeolitic

+0

@Praxeolitic、受け入れのわずかな変更を行うには、実装を伴わなければなりません。 – SergeyA

+1

@ SergeyA提案がうまく構成され、説得力のある動機付けのセクションと健全な言葉遣いの両方を持っているなら、それは明らかに間違っています。既存の実装は、受け入れの変更をある程度まで上げますが、必要ではありません(あなたの論文のより重要な特性を補うものではありません)。 – Columbo

関連する問題