0Pricing
C++ Academy · レッスン

ラムダ式:キャプチャ、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, b

mutableなラムダ

デフォルトでは、値でキャプチャした変数はラムダ内で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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. auto、decltype、型推論
  2. 範囲ベースfor、nullptr、enum class
  3. ラムダ式:キャプチャ、mutable、ジェネリック
  4. 構造化束縛とif-init(C++17)
← C++ Academyに戻る