概要
JavaScript/TypeScriptでは,変数のスコープの可能な限り小さくしてスコープ汚染を防ぐために,以下のような即時関数(関数を定義すると同時に実行する)がよく用いられます.
const s: string = (() => {
let ss = ""
// 一時的な変数ssを使った処理
return ss
})() // ()をつけてアロー関数を即実行する
// 以降,スコープ外の一時的な変数にはアクセスできない.また,文字列sはconstなので誤って変更される恐れはない.
C++(C++11以降)でもラムダ式を用いることで同じこと(関数を定義すると同時に実行する)ができます.具体的には,ラムダ式の処理内容を記述する{}
の直後にラムダ式を実行する()
を挿入することである.こうすることで宣言したラムダ式をその場で実行することができます.
注意点として,JavaScript/TypeScriptと異なりC++では変数が自動キャプチャされません.C++ではラムダ式の[]
においてラムダ式内で使用する変数を明示的にキャプチャする必要があります.
ソースコード
#include <iostream>
#include <sstream>
#include <string>
int main() {
const std::string& s0 = [/* キャプチャする変数 */]() {
std::stringstream ss;
ss << "Lambda expression"; // 一時的な変数を用いた処理
ss << " ("
<< "Immediately Invoked Function Expression"
<< ")";
return ss.str();
}(); // ()をつけてラムダ式を即時実行する
std::cout << s0 << std::endl;
// 以降,ラムダ式内で宣言された一時的な変数にはアクセスできない.また,文字列s0はconstなので誤って変更される恐れはない
return 0;
}