C++のラムダ関数がローカル変数をキャプチャするときに関数ポインタに変換できなくなるのはなぜ？


以下のコードがコンパイルできないのは何故なんでしょうか？

[code]

    void f() {
        int x;
        +[x]{};
    }
    
[/code]

一見コンパイルできると思ったのですが、GCCでもClangでもMSVCでもコンパイルエラーでした。  
なお以下はコンパイルできるようです。

[code]

    void f() {
        +[]{};
    }
    
[/code]




キャプチャする`int x`変数はスコープを抜けた時点で消去されます。しかし、ラムダ関数は別のスコープを持っています。 **キャプチャする**
と表現しているように、別の領域にコピーしていますし、それを破棄する処理も必要になります。つまり、ラムダ関数は関数の実行とは別にキャプチャしたオブジェクトの管理も必要になってきます。そうなると関数ポインターでは表現できなくなります。




キャプチャする`int x`変数はスコープを抜けた時点で消去されます。しかし、ラムダ関数は別のスコープを持っています。 **キャプチャする**
と表現しているように、別の領域にコピーしていますし、それを破棄する処理も必要になります。つまり、ラムダ関数は関数の実行とは別にキャプチャしたオブジェクトの管理も必要になってきます。そうなると関数ポインターでは表現できなくなります。

