2016-09-06 43 views
25

私はそれのようないくつかのコードを使用し、ラムダ式があります。ラムダ式に<functional>が必要ですが、関数<void()>が必要なのはなぜですか?

#include <vector> 
#include <algorithm> 
int main(){ 
    std::vector<int> vi={3,1}; 
    std::sort(vi.begin(),vi.end(),[](int x,int y){ 
     return x<y; 
    }); 
    return 0; 
} 

コンパイルする#include< functional>が必要ですが、私はラムダ関数格納する変数を使用する場合はありません:

#include <vector> 
#include <algorithm> 
#include <functional> 
int main(){ 
    std::vector<int> vi={3,1}; 
    std::function<void()> compf=[](int x,int y){ 
     return x<y; 
    }; 
    std::sort(vi.begin(),vi.end(),compf); 
    return 0; 
} 

をその後、私は必要なのコンパイルするには<functional>を含めるには、なぜですか?そして、なぜsort()<functional>も含まれていないのですか?

+9

ラムダがstd ::関数であるという印象を受けていますか?そうではありません;あなたが 'compf'にそれを保存すると、変換があります。 – user2357112

+9

ラムダ式は言語の一部です。 'std :: function'は標準ライブラリの一部であるため、ヘッダincludeが必要です。 –

+4

@PaulRooney、for(int i:{1、2、3}) 'はまた、明示的な標準ライブラリの使用にもかかわらず、ヘッダインクルードを必要とします。 – chris

答えて

46

ラムダ式がコア言語機能であるため、コンパイラによって提供されるためです。 std::functionはライブラリ機能であり、コードで実装されています。ラムダを変数に格納するために何も含める必要はありません。

auto f = [](int x, int y){ return x < y; }; 

あなただけが(それが実現しています場所それはだから)std::functionに保管することを計画している場合<functional>を含める必要があります。

ラムダのタイプがstd::functionであると思われるようです。そうではない。すべてのラムダ式には、固有の名前を付けることのできない型があります。私は上記のタイプをautoと捉えました。 std::functionは、のような適切な署名を持つオブジェクトを格納できるより一般的なタイプです。たとえば、std::function<int(int,int)>オブジェクトを作成し、それに通常の関数、関数オブジェクト、およびラムダを割り当てることができます。

ダイナミックアロケーションと間接的な形での一般性にもコストがかかります。ラムダを実際の型の変数に使用するのは非常にしばしばインライン化されます。

+1

'std :: function <>'実装は、特定のサイズ以下の呼び出し可能ファイルの動的割り当てを避けるための静的ストレージを持つことができます。これは小さな文字列の最適化に似ています。 – user2296177

+1

行はどのように機能するはずですか? _ "plus_t" _型の匿名オブジェクトを作成しますか? – blackpen

+1

「割当」するのではなく「割当」することを意味するのではありませんか? –

6

ラムダ関数は言語の一部であり、ライブラリには依存しません。一方、標準ライブラリの一部であり、標準ライブラリヘッダファイルfunctionalで定義されています。

std::function<void()> compf=[](int x,int y){ 
    return x<y; 
}; 
std::sort(vi.begin(),vi.end(),compf); 

の使用が#include Dであることfunctionalを必要とする

したがって、

std::sort(vi.begin(),vi.end(),[](int x,int y){ 
    return x<y; 
}); 

の使用が#include Dであることfunctionalを必要としません。

関連する問題