9

何が機能するかを調べるexception_ptrと、C++11 標準は (18.8.5/7) と述べています。

同じ例外オブジェクトを参照する exception_ptr オブジェクトで rethrow_exception を使用しても、データ競合は発生しません。[注: rethrow_exception が (コピーではなく) 同じ例外オブジェクトを再スローする場合、その再スローされた例外オブジェクトへの同時アクセスにより、データ競合が発生する可能性があります...

この奇妙な「注」が適用されるケースは見つかりません。説明されている効果rethrow_exceptionは「スロー: p が参照する例外オブジェクト」ですが、15.1/3 では、一般的な例外スロープロセスの義務を説明しており、「例外コピーをスローする」ことが義務付けられています。 -例外オブジェクトと呼ばれる一時オブジェクトを初期化します。」

奇妙なメモは、rethrow_exception がこのコピー初期化をスキップすることを意味します。しかし、これは本当に可能ですか?

4

3 に答える 3

4

と言うとthrow x;、例外オブジェクトは と同じ型xですが、コピーです。

と言うstd::rethrow_exception(p);と、例外オブジェクトはポインターによって参照される実際のオブジェクトであり、それ以上のコピーは作成されません。

したがって、複数のスレッドが同時に同じ例外ポインター (コピーが許可されています!) を再スローすると、それらはすべて同じオブジェクトへの参照を持ちます。

于 2013-02-08T15:12:12.663 に答える
2

はい、可能です。例外処理メカニズムには、最初にスローされたオブジェクトのコピーが既にあり、プライベート メモリ スタッシュに取り除かれています。通常、exception_ptrそのコピーの参照カウントを管理するスマート ポインターとして実装されます。

一般要件に関しては、特定要件が一般要件と競合する場合、特定要件が優先されます。

于 2013-02-08T15:11:39.147 に答える