C++11 lambda使用

3123 ワード

Lambdaは匿名関数であり,inline関数として使用できる(プログラマーの「起名困難症候群」を解決するために用いられる)
Lambda関数形式:[...](...) ... {...}
[]内はcaptureで、lambda内部でアクセスできる「nonstatic外部変数」で、アクセスする変数がなければ空にできます.static変数は直接アクセスできます.
()内はパラメータで、関数パラメータと同じです.
... mutable、異常詳細、属性説明子(noexceptなど)、または戻りタイプです.いずれかが現れる場合は、()が表示されなければなりません.
{}内は関数体で、ここにlambdaが完成する仕事を明記します.
例:
#include 

using namespace std;

int main()
{
    []() { cout << "hello, world" << endl; }();
    return 0;
}

最後の()は関数呼び出しです.
次のように呼び出すこともできます.
auto f = []() { cout << "hello, world" << endl; };
f();
#include 

using namespace std;

int main()
{
    auto f = [](int a) { cout << "hello, world " << a << endl; };
    f(12);
    return 0;
}

戻りタイプ:
#include 

using namespace std;

int main()
{
    auto f = [](int a) { cout << "hello, world " << a << endl; return a; };
    auto k = f(12);
    cout << k << endl;
    return 0;
}

C++のタイプ導出システムは、関数の戻りタイプを自動的に導出します.
// return int
auto f = [](int a) -> int { cout << "hello, world " << a << endl; return a; }; 
// return double
auto f = [](int a) -> double { cout << "hello, world " << a << endl; return a; };

Capture -- passing by value
#include 

using namespace std;

int main()
{
    int xxx = 10;
    auto f = [xxx]() { cout << "hello, world " << xxx << endl;  };
    f();
    return 0;
}
#include 

using namespace std;

int main()
{
    int xxx = 10;
    auto f = [&xxx]() { cout << "hello, world " << ++xxx << endl;  };
    cout << xxx << endl;
    f();
    cout << xxx << endl;
    return 0;
}

Lambdaは内部でxxxを変更でき、外部変数に影響します.
特殊な形式:
    [=] (...) ... {...} 外部のすべての変数をlambdaに渡しますが、内部では変更できません.passing by value
    [&] (...) ... {...} 外部のすべての変数をlambdaに渡し、内部で変更でき、外部変数に影響を与える--passing by ref..
    [=,&y] (...) ... {...} すべての変数をlambdaに渡して、yは内部で修正することができて、残りの変数はできません
    [y, &] (...) ... {...} すべての変数をlambdaに渡します.yは内部で変更できません.残りの変数は
mutable:
// from The C++ Standard Library

#include 

using namespace std;

int main()
{
    int id = 0;
    auto f = [id]() mutable { cout << "id: " << id << endl; ++id; };
    id = 42;
    f();
    f();
    f();
    cout << id << endl;
    return 0;
}
//     :
// id: 0
// id: 1
// id: 2
// 42

このコードにはmutableキーワードがあるため、lambdaはpassing by valueとpassing by referenceの混合体となり、最初の呼び出し時に一時的なコピーが作成され、その後の呼び出しでこのコピーが変更されます.注意すべきは、lambdaが定義時からアクセス可能な値を取得し、id=0は、fがいつ呼び出されるかに関係なく取得される.
Lambdaのタイプを書くのはお勧めしません.タイプを書かなければならない場合はdecltype()を使用するか、STL内のfunction<>を使用します.
転載:https://www.cnblogs.com/DevinSuMi/p/6290688.html