C++ 11標準は、(私が持っているか、少なくとも、バージョン - ない最終1)言う:とラムダ式のため暗黙の「ラムダから関数へのポインタ変換」は、静的メンバーの「参照による」キャプチャを禁止するのはなぜですか?
閉鎖型の無ラムダキャプチャは、公共 を持っています非仮想非明示的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
}
};
なぜラムダをファンクションポインタに変換することができないのですか?私は何かを逃しているのですか、委員会はこの特定の点を忘れていますか?
私は、コンパイル時に何がキャプチャされているかについて何かを証明できるようにすることを避けることを推測します。 – Flexo
コンパイラは、(自動[&]を使用して)使用されるとすぐに変数を自動的にキャプチャすることができるため、静的メンバであるかグローバルであるかをチェックする作業は必要ありません以前に宣言された –
実際に私はどのコンパイラでもテストしていません(関数ポインタ変換をサポートしていないMSVC10しかありません)。私はそれがGCC拡張だと思いますか?とにかく、私の質問です:それは標準で許可されています(多分私は何かを逃した)?いいえ、なぜそれは禁じられていますか(多分私が知らない技術的な制限があります)? –