C++ 11標準は次のように述べています(または少なくとも、私が持っているバージョン-最終バージョンではありません):
ラムダ キャプチャのないラムダ式のクロージャ型には、クロージャ型の関数呼び出し演算子と同じパラメーターと戻り値の型を持つ関数へのポインターへの public 非仮想非明示的な const 変換関数があります。
関数ポインターはそれ自体でデータを保持できないため、ステートフルラムダから関数ポインターを取得できない理由を理解しています。
ただし、キャプチャされたオブジェクトが単なる静的メンバー/静的変数である場合、キャプチャされたオブジェクトへの参照は関数自体に組み込まれているため、そのような制限はありません。
struct A {
static int count = 0;
void foo() {
static int bar = 0;
auto fun = [&]()->void {
count++;
bar++;
};
void(*ptrFun)();
ptrFun = fun; // forbidden by the quoted wording
}
};
前者がステートレスになるとすぐに、ラムダを関数ポインターに変換することが常に可能ではないのはなぜですか? 私は何かを見逃していますか、それとも委員会はこの特定の点を忘れていましたか?