コピー不可の例外クラスを作成することを考えています。コピー コンストラクター内での割り当て中にスローされる可能性のある例外について心配する必要がないため、興味深いと思います。例外オブジェクトの作成が成功した場合、すべて問題なく、std::terminate
.
struct exception
{
exception() = default;
exception(const exception&) = delete;
exception(exception&&) noexcept = default;
~exception() noexcept = default;
auto operator=(const exception&) -> exception& = delete;
auto operator=(exception&&) noexcept -> exception& = delete;
};
int main()
{
try {
try {
throw exception{};
} catch (...) {
std::rethrow_exception(
std::current_exception());
}
} catch (const exception& e) {
return 1;
}
}
GCC-4.7 と Clang-3.2 は上記のコードを受け入れます。しかし、私は少し驚いています。私の知る限り、例外オブジェクトがコピーされる状況がいくつかありstd::current_exception()
ますstd::rethrow_exception()
。
質問:上記のコードは C++11 に従って正しいですか?つまり、C++11 に準拠するすべてのコンパイラで受け入れられますか?
編集:std::rethrow_exception
とを例に追加std::current_exception
。どちらのコンパイラもこのバージョンを受け入れます。これにより、例外がスローされたときにコンパイラがコピー コンストラクタを必要としない場合、コンパイラはこれら 2 つの関数が使用されているときにコピー コンストラクタを必要としないことが明確になります。