19

現在の C++11 標準では、次のようなラムダ式の変数のムーブ キャプチャはサポートされていません

unique_ptr<int[]> msg(new int[1000000]);
async_op([&&msg] { // compile error : move capture is not supported
   /* do something */
});

メッセージ パッシングと一意の所有権は非同期システムの設計において重要な役割を果たしているため、ムーブ セマンティックはファースト クラスの言語セマンティックとして扱われるべきだと思います。ただし、ラムダはムーブ キャプチャをサポートしていません。

もちろん、ムーブ キャプチャ プロキシを使用する回避策があることは知っていますが、その重要性にもかかわらず、この機能を C++11 標準に含めないという決定の理由を知りたいです。

4

1 に答える 1

5

C ++仕様は、かなり保守的にしようとしています。次の言語仕様が前の仕様に準拠していたプログラムを破ることは本当に悪いことです。

移動セマンティクスは成熟するまでに時間がかかりました。思い出すと、2009年までに変更がありました。一方、ラムダは、同様の時間枠まで多くのコンパイラに実装されていませんでした。ギャップを埋めて、2011年に標準をリリースする時間はありませんでしたが、それはすでに非常に遅れていました。(コンパイラーで仕様のプロトタイプを作成し、コンパイラーをテストし、戻って仕様について議論し、ドラフト、プロトタイプ、テスト、繰り返します。しばらく時間がかかります。)

ラムダは次の標準で大幅に拡張され、型の演繹(autoポリモーフィズム)が得られます。Xeoは、初期化を移行するための1つの潜在的な解決策について言及しています。

ラムダは構文糖衣にすぎないことに注意してください。それらは自動的に定義されたクラスの観点から指定されますが、自分でできないことは何も含まれていません。現在の言語標準に関しては、砂糖がなくなったときにその実装を手動で具体化することが期待されています。

ちなみに、古い機能をキャプチャすることで、不足している機能を回避できる可能性がありますauto_ptr。これは、C++03の現在非推奨となっているスマートポインタの試みです。これは、本質的にmove-on-copyを実装する、独自のコピーコンストラクターによって無効にされます。ただし、C ++ 11では非推奨であり、警告が発生する可能性があります。ただし、同様の実装を試すことができます。

于 2012-11-25T10:48:41.937 に答える