7

このコードが例外をスローできるかどうかを確認しようとしましたが、成功しませんでした:

std::function<void(void)>f=[]{};

標準によれば、std::function のコピーまたは移動コンストラクターは noexcept ではありません。しかし、 noexcept キーワードがないのは、 std::function がコピーまたは移動コンストラクターがスローできるユーザー定義のファンクターオブジェクトもラップするという事実によるものだと思います。

私の場合、例外はほとんどないように思えますが、まったく可能ですか?

4

1 に答える 1

8

私の場合、例外はほとんどないように思えますが、まったく可能ですか?

原則として、はい。std::function初期化された呼び出し可能なオブジェクトを格納するためにメモリを割り当てる必要があり、そのメモリが動的に割り当てられている場合、失敗する可能性があります。

実際には、あなたの場合、いいえ。仕様のメモの言葉を借りれば、「小さな呼び出し可能なオブジェクトに対して動的に割り当てられたメモリの使用を避けるように実装が推奨されます」。キャプチャのないラムダは関数ポインタに変換できます。これは、呼び出し可能なオブジェクトとほぼ同じ大きさです。したがって、適切な実装では、動的割り当てなしでそれを確実に保存する必要があります。そしてもちろん、ポインターをコピーしてもスローできません。

より大きなオブジェクト (多くのキャプチャを持つラムダを含む) は、動的な割り当てが必要であり、キャプチャされたオブジェクトまたはその他の状態をコピーする必要があるため、非スロー保証を提供できません。

于 2013-05-21T08:51:03.380 に答える