ラムダ式:キャプチャ、mutable、ジェネリック
キャプチャ、mutableの意味、autoによるジェネリック引数を備えたラムダを書きます。
「ラムダ式:キャプチャ、mutable、ジェネリック」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
ラムダとは
ラムダは、インラインで定義する無名の関数オブジェクトです。小さな名前付き関数やoperator()を持つ構造体を書く代わりに使います。
auto square = [](int x) { return x * x; };
std::cout << square(5); // 25構文の構成
ラムダは4つの部分で構成されます。
[capture]— 周囲のスコープから使用する変数(parameters)— 関数の引数リストと同じもの-> return_type— 省略可能で、多くの場合は推論されるもの{ body }
空のキャプチャ
[]は「何もキャプチャしない」という意味です。ラムダからはグローバル変数とstatic変数だけにアクセスできます。
auto add = [](int a, int b) { return a + b; };値によるキャプチャ
キャプチャ節に変数を列挙すると、それらのコピーをラムダ内に取り込めます。
int n = 5;
auto times = [n](int x) { return x * n; };
n = 10;
std::cout << times(3); // 15 (captured n was 5)参照によるキャプチャ
&を付けると、参照によってキャプチャします。ラムダ内での変更は、外側の変数に影響します。
int counter = 0;
auto inc = [&counter]() { ++counter; };
inc(); inc(); inc();
std::cout << counter; // 3デフォルトキャプチャ:[=]と[&]
[=]では使用する変数をすべて値でキャプチャし、[&]ではすべて参照でキャプチャします。注意して使い、可能な場合は明示的に指定してください。
auto f = [=]() { return a + b; }; // copies a, b
auto g = [&]() { return a + b; }; // references a, bmutableなラムダ
デフォルトでは、値でキャプチャした変数はラムダ内でconstになります。変更できるようにするにはmutableを追加します。ただし、変更されるのはラムダ内のコピーだけです。
int n = 5;
auto f = [n]() mutable {
n += 1; // OK because of mutable
return n;
};
f(); f(); // returns 6, then 7
std::cout << n; // still 5 in outer scope戻り値の型推論
コンパイラーは本体から戻り値の型を推論します。必要な場合は明示してください。
auto half = [](int x) -> double { return x / 2.0; };ジェネリックラムダ(C++14)
引数リストでautoを使うと、任意の型に対応するジェネリックラムダを作成できます。
auto print = [](const auto& x) { std::cout << x << "\n"; };
print(42); // int
print("hello"); // const char*
print(3.14); // double関数の引数としてのラムダ
STLのアルゴリズムは、述語や変換処理としてラムダを受け取れます。
std::vector<int> v = {5, 2, 8, 1};
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; });ラムダは関数オブジェクトです
内部では、コンパイラーがoperator()を持つクラスを生成します。ラムダはstd::functionやautoに格納できます。
クイックチェック
[n](int x) { return x * n; }というラムダの内部で、ラムダをmutableにせずnへ代入できますか。
まとめ
ラムダは無名のインライン関数オブジェクトです。値または参照でキャプチャし、値でキャプチャした変数を変更するにはmutableを付けます。C++14以降では、ジェネリックラムダにautoの引数を使えます。
よくある質問
「ラムダ式:キャプチャ、mutable、ジェネリック」レッスンは無料ですか?
はい。「ラムダ式:キャプチャ、mutable、ジェネリック」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ラムダ式:キャプチャ、mutable、ジェネリック」で何を学びますか?
キャプチャ、mutableの意味、autoによるジェネリック引数を備えたラムダを書きます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ラムダ式:キャプチャ、mutable、ジェネリック」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- auto、decltype、型推論
- 範囲ベースfor、nullptr、enum class
- ラムダ式:キャプチャ、mutable、ジェネリック
- 構造化束縛とif-init(C++17)