1. 導入:なぜ「参照キャプチャ」が必要なのか?
C++のラムダ式は、関数の中に小さな関数を定義できる非常に便利な機能です。しかし、ラムダ式の外側にある変数を使おうとすると、通常は「コピー」として扱われるため、元の変数を書き換えることができません。そこで登場するのが「参照キャプチャ」です。これを使うことで、ラムダ式の内部から元の変数を直接操作できるようになり、効率的かつ柔軟なプログラムが書けるようになります。
2. 基礎知識:キャプチャとは何か?
ラムダ式の構文は「[](){ … }」という形をしています。最初の「[]」はキャプチャ節と呼ばれ、外部の変数をどのように取り込むかを指定します。「[&]」と記述すると、外側にあるすべての変数を「参照」として取り込みます。
参照とは、いわば変数の「別名」です。参照キャプチャを使えば、ラムダ式の中で行った変更が、そのまま元の変数にも反映されます。
3. 実装と仕組み
参照キャプチャ「[&]」を使うと、ラムダ式の内部から外側のスコープにある変数へ直接アクセスできます。これにより、データの更新処理を簡潔に記述したり、アルゴリズム関数(std::for_eachなど)の中で外部の集計用変数を使ったりする際に威力を発揮します。
4. サンプルプログラム
以下のコードをコピーして、コンパイラで実行してみてください。ラムダ式によって外部の変数がどう変化するかを確認できます。
include
int main() {
int count = 0;
int total = 0;
// [&] を使うことで、外部の count と total を参照として取り込む
auto add_value = [&](int value) {
count++; // 外部の count をインクリメント
total += value; // 外部の total に加算
};
add_value(10);
add_value(20);
// 結果を表示:外部変数が書き換わっていることがわかります
std::cout << "実行回数: " << count << std::endl; // 出力: 2
std::cout << "合計値: " << total << std::endl; // 出力: 30
return 0;
}
5. 応用・注意点:知っておくべきリスク
参照キャプチャは非常に便利ですが、一つだけ重大な注意点があります。それは「寿命の問題」です。
ラムダ式が実行される前に、参照している元の変数が破棄されてしまうと、不正なメモリ参照(ダングリング参照)が発生し、プログラムがクラッシュしてしまいます。
特に、ラムダ式を関数の外へ戻り値として返したり、別のスレッドに渡したりする場合は注意が必要です。その場合は、参照ではなく「値キャプチャ(コピー)」を使うか、変数の寿命が確実にラムダ式よりも長いことを確認するようにしましょう。初心者の方は、まずは「同じスコープ内ですぐに使う」ケースから練習することをおすすめします。

コメント